我有两个数据帧(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
答案 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)
您可以将match
与lapply
一起使用。如果我们通过名称向量在每个原始数据集的[[
列上匹配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
快得多。