多个条件使用 df 中的元素匹配查找中的 colname table 以合并 3 个数据帧

Multiple conditions using element in df matching a colname in lookup table to merge 3 dataframes

我有三个大数据框,我想根据几个条件将一个数据框的一些元素附加到另一个数据框上。我在 Stack Overflow 中查找了类似的问题,但它们似乎不适用于我的数据帧格式(或者我不够熟练,无法正确调整它)。

需要发生的是:

  1. 在 maindf1 中按性别过滤
  2. 在 maledflookup 的行名(第一列)中搜索 maindf1 中相同的 ID 值
  3. 同样在maledflookup
  4. 列名的maindf1中的一行中搜索正确的年龄层
  5. 向 maindf1 行添加一个新的数据列,其匹配 ID 具有从 maledflookup 中获取的该性别和年龄层的人口值
  6. 重复 femaldflookup
  7. 最终结果是 maindf1 的每一行都有一个按性别、ID 和年龄层匹配的人口值

我没有写出成功的代码,因为我对 R 编码还不是很熟悉。我尝试了一些 for & if 循环,但未能为此任务调整 fuzzyjoin 代码。感谢您的帮助!

示例数据:

ID<- c("12345", "NA", "NA", "44444", "99999", "11111" )
sex <- c("female", "male", "male", "male", "female", "male")
agegrp <- c("pop_0to4", "pop_70to74", "pop_25to29", "pop_70to74","pop_70to74","pop_25to29")
maindf1 <- data.frame(ID, sex, agegrp)

ID<- c("12345", "23456", "12225", "44444", "99999", "11111" )
pop_0to4 <- c("2000", "1300", "900", "737", "289", "120")
pop_70to74 <- c("25", "222", "52", "160", "100", "80")
pop_25to29 <- c("3000", "2500", "102", "1777", "3390", "2450")
maledflookup<- data.frame(ID, pop_0to4, pop_25to29, pop_70to74)

ID<- c("12345", "23456", "12225", "44444", "99999", "11111" )
pop_0to4 <- c("1111", "2333", "999", "888", "222", "122")
pop_70to74 <- c("18", "333", "66", "300", "90", "99")
pop_25to29 <- c("3333", "2555", "111", "2777", "3311", "2121")
femaledflookup <- data.frame(ID, pop_0to4, pop_25to29, pop_70to74)

数据和查找表看起来像(2000 行):

#maindf1
#ID    #sex     #agegrp
12345   female  pop_0to4        
NA      male    pop_70to74      
NA      male    pop_25to29      
44444   male    pop_70to74      
99999   female  pop_70to74      
11111   male    pop_25to29

#maledflookup
#ID    #pop_0to4  #pop_25to29   #pop_70to74
12345   2000       3000         25  
23456   1300       2500         222 
12225   900        102          52  
44444   737        1777         160 
99999   289        3390         100 
11111   120        2450         80

#femaledflookup
#ID    #pop_0to4  #pop_25to29   #pop_70to74
12345   1111        3333         18 
23456   2333        2555        333 
12225   999         111          66 
44444   888         2777        300 
99999   222         3311         90 
11111   122         2121         99

期望的结果:

#maindf1
#ID    #sex    #agegrp       #population
12345   female  pop_0to4        1111        
NA      male    pop_70to74      NA
NA      male    pop_25to29      NA
44444   male    pop_70to74      160 
99999   female  pop_70to74      90  
11111   male    pop_25to29      2450            

使用 tidyverse 中的 left_join 和格式正确的查找 table:

library(tidyverse)

.maledflookup <- maledflookup %>%
  gather(-ZCTA, key = agegrp, value = censuspop) %>%
  mutate(sex = "male")

.femaledflookup <- femaledflookup %>%
  gather(-ZCTA, key = agegrp, value = censuspop) %>%
  mutate(sex = "female")

.lookup <- bind_rows(.maledflookup, .femaledflookup)

left_join(maindf1, .lookup, by = c("sex", "ZCTA", "agegrp"))
  1. 使用 gather 旋转男性数据以获得包含列 ZCTAagegrpcensuspop 的数据框。还要为性别添加一个新列。
  2. 重复女性数据
  3. 使用 bind_rows
  4. 连接男性和女性数据
  5. 使用 ZCTAagegrpsex 加入查找 table。