我有两个数据帧(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)
你可以用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
Run Code Online (Sandbox Code Playgroud)
请注意,这也比它快得多merge.
试试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功能)的更多信息.