【问题标题】:merging two data frame with different age form合并两个不同年龄形式的数据框
【发布时间】:2021-05-17 14:39:49
【问题描述】:

我有两个具有不同变量的数据框,名为“df”和 df1。我想要做的是基于“性别”、“年龄”和“地区”将 df1 与“df”合并,使得“df”中的年龄获得给定的 AC 值。例如,如果 AC 位于 20-24 年龄段,则“df”中介于 20 到 24 之间的所有年龄都将获得相同的 AC 值。提前谢谢你。

df<- 
   district residence gender  age   weight  id
      
        1         1      1    12   26.8     1
        2         2      2    14   21.4     2
        3         1      1    20   24.2     3
        4         2      2    23   35.8     4
        5         1      1    31   42.3     5
        6         2      2    16   25.2     6
        7         1      1    22   35.3     7
        8         2      2    45   25.3     8
        9         1      1    48   36.2     9
       10         2      2    39   35.5    10


df1<-
      district age    gender   AC
         1   15-19      2    0.0301 
         2   20-24      2    0.0934 
         3   25-29      2    0.108  
         4   30-34      2    0.0894 
         5   35-39      2    0.0444 
         6   40-44      2    0.00945
         7   45-49      2    0.00226
         8   15-19      2    0.0258 
         9   20-24      2    0.0701 
        10   25-29      2    0.0827 

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以将df1的年龄列分成两列,使用fuzzyjoin

    library(dplyr)
    library(tidyr)
    library(fuzzyjoin)
    
    df1 %>%
      separate(age, c('start', 'end'), sep = '-', convert = TRUE) %>% 
      fuzzy_right_join(df, 
                       by = c('district', 'gender', 'start' = 'age', 'end' = 'age'), 
                       match_fun = c(`==`, `==`, `<=`, `>=`))  
    

    【讨论】:

      【解决方案2】:

      这实际上是一个糟糕的最小示例,因为您的数据中没有这样的匹配项。我稍微修改了你的数据。另请注意,您在 df 中有一些年龄在 df1 中没有标签。

      df$district=1
      df1$district=1
      
      df$age1=cut(
        df$age,
        c(0,as.numeric(unlist(lapply(strsplit(unique(df1$age),"-"),"[[",2)))),
        labels=sort(unique(df1$age))
      )
      
      merge(
        df,
        df1,
        by.x=c("gender","age1","district"),
        by.y=c("gender","age","district")
      )
      
        gender  age1 district residence age weight id      AC
      1      2 15-19        1         2  14   21.4  2 0.03010
      2      2 15-19        1         2  14   21.4  2 0.02580
      3      2 15-19        1         2  16   25.2  6 0.03010
      4      2 15-19        1         2  16   25.2  6 0.02580
      5      2 20-24        1         2  23   35.8  4 0.07010
      6      2 20-24        1         2  23   35.8  4 0.09340
      7      2 35-39        1         2  39   35.5 10 0.04440
      8      2 45-49        1         2  45   25.3  8 0.00226 
      

      【讨论】:

      • 非常感谢。我如何考虑年龄范围?在您的代码中,您从年龄 0 开始( c(0,as.numeric(unlist(lapply...),我想从 0 到 100 开始。
      • @mehmo 我不明白。在我的代码中,我将第一个间隔的下限设置为 0,您可以将其更改为任何其他数字。我的代码目前是基于 df1 中的现有间隔编写的,如果这些间隔发生变化,合并也会发生变化。
      猜你喜欢
      • 1970-01-01
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2017-04-01
      • 2020-10-20
      相关资源
      最近更新 更多