如何合并 2 个数据框以填充 R 中的缺失值?
How to merge 2 data frames filling out missing values in R?
我已经使用 dplyr
和 merge
函数一段时间了,但我只是 运行 进入了一个我无法弄清楚如何简单地完成的任务方法。我想合并两个数据框。第二个数据框缺少一些列。我希望 merge 的输出用第一个数据框的相应值填充这些值。
数据框如下所示:
#df1
participant = c(1,2,3)
age = c(18,23,19)
gender = c(rep("female",2),"male")
experiment = rep("noun",3)
rt = c(218,111,546)
df1 = data.frame(participant, age, gender,experiment,rt)
participant age gender experiment rt
1 1 18 female noun 218
2 2 23 female noun 111
3 3 19 male noun 546
#df2
participant = c(1,2,3)
experiment = rep("verb",3)
rt = c(238,251,140)
df2 = data.frame(participant, experiment,rt)
participant experiment rt
1 1 verb 238
2 2 verb 251
3 3 verb 140
输出数据框应该是这样的:
participant age gender experiment rt
1 1 18 female noun 218
2 2 23 female noun 111
3 3 19 male noun 546
4 1 18 female verb 238
5 2 23 female verb 251
6 3 19 male verb 140
目标是 df2
使用列 participant、 和值合并列 age 和 gender 取自 df1
。我尝试了很多东西(join
、rbind.fill
等所有类型),我也在论坛上四处张望,但我找不到一种简单的方法来实现绑定的行两个数据框并使用特定列作为参考填写 df2
中的缺失值。在我的示例中,只有 2 列需要填写(年龄和性别),但我的真实 df1
有更多,所以我想避免手动指定它们。
各位数据合并高手如果有什么建议,将不胜感激!
我们将数据集放在 list
中,使用 rbindlist
和 fill=TRUE
(来自 data.table
),按参与者分组,我们分配(:=
) 'age' 和 'gender' 作为该列中的非 NA 值。
library(data.table)
rbindlist(list(df1, df2), fill=TRUE)[, c('age', 'gender') :=
lapply(.SD, na.omit) , participant, .SDcols=age:gender][]
# participant age gender experiment rt
#1: 1 18 female noun 218
#2: 2 23 female noun 111
#3: 3 19 male noun 546
#4: 1 18 female verb 238
#5: 2 23 female verb 251
#6: 3 19 male verb 140
或者仅使用 base R
,我们 rbind
两个数据集中共有的列的子集,然后根据在一个数据集中找到的列创建其他列其他。
i1 <- intersect(names(df1), names(df2))
res <- rbind(df1[i1], df2[i1])
nm1 <- setdiff(names(df1),i1)
res[nm1] <- df1[nm1]
res
# participant experiment rt age gender
#1 1 noun 218 18 female
#2 2 noun 111 23 female
#3 3 noun 546 19 male
#4 1 verb 238 18 female
#5 2 verb 251 23 female
#6 3 verb 140 19 male
我已经使用 dplyr
和 merge
函数一段时间了,但我只是 运行 进入了一个我无法弄清楚如何简单地完成的任务方法。我想合并两个数据框。第二个数据框缺少一些列。我希望 merge 的输出用第一个数据框的相应值填充这些值。
数据框如下所示:
#df1
participant = c(1,2,3)
age = c(18,23,19)
gender = c(rep("female",2),"male")
experiment = rep("noun",3)
rt = c(218,111,546)
df1 = data.frame(participant, age, gender,experiment,rt)
participant age gender experiment rt
1 1 18 female noun 218
2 2 23 female noun 111
3 3 19 male noun 546
#df2
participant = c(1,2,3)
experiment = rep("verb",3)
rt = c(238,251,140)
df2 = data.frame(participant, experiment,rt)
participant experiment rt
1 1 verb 238
2 2 verb 251
3 3 verb 140
输出数据框应该是这样的:
participant age gender experiment rt
1 1 18 female noun 218
2 2 23 female noun 111
3 3 19 male noun 546
4 1 18 female verb 238
5 2 23 female verb 251
6 3 19 male verb 140
目标是 df2
使用列 participant、 和值合并列 age 和 gender 取自 df1
。我尝试了很多东西(join
、rbind.fill
等所有类型),我也在论坛上四处张望,但我找不到一种简单的方法来实现绑定的行两个数据框并使用特定列作为参考填写 df2
中的缺失值。在我的示例中,只有 2 列需要填写(年龄和性别),但我的真实 df1
有更多,所以我想避免手动指定它们。
各位数据合并高手如果有什么建议,将不胜感激!
我们将数据集放在 list
中,使用 rbindlist
和 fill=TRUE
(来自 data.table
),按参与者分组,我们分配(:=
) 'age' 和 'gender' 作为该列中的非 NA 值。
library(data.table)
rbindlist(list(df1, df2), fill=TRUE)[, c('age', 'gender') :=
lapply(.SD, na.omit) , participant, .SDcols=age:gender][]
# participant age gender experiment rt
#1: 1 18 female noun 218
#2: 2 23 female noun 111
#3: 3 19 male noun 546
#4: 1 18 female verb 238
#5: 2 23 female verb 251
#6: 3 19 male verb 140
或者仅使用 base R
,我们 rbind
两个数据集中共有的列的子集,然后根据在一个数据集中找到的列创建其他列其他。
i1 <- intersect(names(df1), names(df2))
res <- rbind(df1[i1], df2[i1])
nm1 <- setdiff(names(df1),i1)
res[nm1] <- df1[nm1]
res
# participant experiment rt age gender
#1 1 noun 218 18 female
#2 2 noun 111 23 female
#3 3 noun 546 19 male
#4 1 verb 238 18 female
#5 2 verb 251 23 female
#6 3 verb 140 19 male