如何合并 2 个数据框以填充 R 中的缺失值?

How to merge 2 data frames filling out missing values in R?

我已经使用 dplyrmerge 函数一段时间了,但我只是 运行 进入了一个我无法弄清楚如何简单地完成的任务方法。我想合并两个数据框。第二个数据框缺少一些列。我希望 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。我尝试了很多东西(joinrbind.fill 等所有类型),我也在论坛上四处张望,但我找不到一种简单的方法来实现绑定的行两个数据框并使用特定列作为参考填写 df2 中的缺失值。在我的示例中,只有 2 列需要填写(年龄和性别),但我的真实 df1 有更多,所以我想避免手动指定它们。

各位数据合并高手如果有什么建议,将不胜感激!

我们将数据集放在 list 中,使用 rbindlistfill=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