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

时间:2014-08-28 01:22:24

标签: 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

2 个答案:

答案 0 :(得分:7)

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

df2$AGE <- NULL
df2$SEX <- NULL
df3 <- merge(df1, df2, by = "id")

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

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

您可以在r控制台中输入merge,详细了解?merge()(或任何r功能)。

答案 1 :(得分:7)

您可以将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

请注意,这也比merge快得多。