从R中的两个数据帧填充具有匹配ID的列

Ame*_*mer 5 r

我有两个数据帧(df1,df2).我想填写从df1到df2的AGE和SEX值,条件是在两者之间具有相同的ID.我尝试了几种方法使用for循环并检查两个数据帧之间的主题ID匹配,但我失败了.结果应与df3中的结果相同.我有一个庞大的数据集,所以我希望R中的一段代码能够轻松完成.非常感谢您的帮助.谢谢.

df1:
ID    AGE   SEX
90901   39  0
90902   28  0
90903   40  1

df2:
ID     AGE  SEX  Conc
90901   NA  NA    5
90901   NA  NA    10
90901   NA  NA    15
90903   NA  NA    30
90903   NA  NA    5
90902   NA  NA    2.45
90902   NA  NA    51
90902   NA  NA    1
70905   NA  NA    0.5

result:
df3:
ID     AGE  SEX  Conc
90901   39  0     5
90901   39  0     10
90901   39  0     15
90903   40  1    30
90903   40  1    5
90902   28  1    2.45
90902   28  0    51
90902   28  0     1
70905   NA  NA    0.5
Run Code Online (Sandbox Code Playgroud)

Ric*_*ven 8

你可以用matchlapply来做这件事.如果我们通过名称向量迭代每个原始数据集[[ID列,我们可以得到所需的结果.

nm <- c("AGE", "SEX")
df2[nm] <- lapply(nm, function(x) df1[[x]][match(df2$ID, df1$ID)])
df2
#      ID AGE SEX  Conc
# 1 90901  39   0  5.00
# 2 90901  39   0 10.00
# 3 90901  39   0 15.00
# 4 90903  40   1 30.00
# 5 90903  40   1  5.00
# 6 90902  28   0  2.45
# 7 90902  28   0 51.00
# 8 90902  28   0  1.00
# 9 70905  NA  NA  0.50
Run Code Online (Sandbox Code Playgroud)

请注意,这也比它快得多merge.


jed*_*jed 7

试试merge(df1, df2, by = "id").这会将两个数据框合并在一起.如果您的示例很好地表示了您的实际数据,那么您可能希望在合并之前继续从df2中删除年龄和性别列.

df2$AGE <- NULL
df2$SEX <- NULL
df3 <- merge(df1, df2, by = "id")
Run Code Online (Sandbox Code Playgroud)

如果你需要保留df2中的行,即使你在df1中没有匹配的id,那么你这样做:

df2 <- subset(df2, select = -c(AGE,SEX) )
df3 <- merge(df1, df2, by = "id", all.y = TRUE)
Run Code Online (Sandbox Code Playgroud)

您可以merge通过?merge()在r控制台中输入来了解有关(或任何r功能)的更多信息.