多个条件使用 df 中的元素匹配查找中的 colname table 以合并 3 个数据帧
Multiple conditions using element in df matching a colname in lookup table to merge 3 dataframes
我有三个大数据框,我想根据几个条件将一个数据框的一些元素附加到另一个数据框上。我在 Stack Overflow 中查找了类似的问题,但它们似乎不适用于我的数据帧格式(或者我不够熟练,无法正确调整它)。
需要发生的是:
- 在 maindf1 中按性别过滤
- 在 maledflookup 的行名(第一列)中搜索 maindf1 中相同的 ID 值
- 同样在maledflookup
的列名的maindf1中的一行中搜索正确的年龄层
- 向 maindf1 行添加一个新的数据列,其匹配 ID 具有从 maledflookup 中获取的该性别和年龄层的人口值
- 重复 femaldflookup
- 最终结果是 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"))
- 使用
gather
旋转男性数据以获得包含列 ZCTA
、agegrp
和 censuspop
的数据框。还要为性别添加一个新列。
- 重复女性数据
- 使用
bind_rows
连接男性和女性数据
- 使用
ZCTA
、agegrp
和 sex
加入查找 table。
我有三个大数据框,我想根据几个条件将一个数据框的一些元素附加到另一个数据框上。我在 Stack Overflow 中查找了类似的问题,但它们似乎不适用于我的数据帧格式(或者我不够熟练,无法正确调整它)。
需要发生的是:
- 在 maindf1 中按性别过滤
- 在 maledflookup 的行名(第一列)中搜索 maindf1 中相同的 ID 值
- 同样在maledflookup 的列名的maindf1中的一行中搜索正确的年龄层
- 向 maindf1 行添加一个新的数据列,其匹配 ID 具有从 maledflookup 中获取的该性别和年龄层的人口值
- 重复 femaldflookup
- 最终结果是 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"))
- 使用
gather
旋转男性数据以获得包含列ZCTA
、agegrp
和censuspop
的数据框。还要为性别添加一个新列。 - 重复女性数据
- 使用
bind_rows
连接男性和女性数据
- 使用
ZCTA
、agegrp
和sex
加入查找 table。