使用R中两个数据帧的匹配ID填充列
我有两个数据帧(df1,df2)。我想填写从df1到df2的年龄和性别值,条件是两者具有相同的ID。我尝试了几种使用for循环和检查两个数据帧之间的主题ID匹配的方法,但都失败了。结果应与df3中的结果相同。我有一个巨大的数据集,所以我想要一段R代码,可以很容易地做到这一点。我将感谢你在这方面的帮助。多谢各位使用R中两个数据帧的匹配ID填充列,r,R,我有两个数据帧(df1,df2)。我想填写从df1到df2的年龄和性别值,条件是两者具有相同的ID。我尝试了几种使用for循环和检查两个数据帧之间的主题ID匹配的方法,但都失败了。结果应与df3中的结果相同。我有一个巨大的数据集,所以我想要一段R代码,可以很容易地做到这一点。我将感谢你在这方面的帮助。多谢各位 df1: ID AGE SEX 90901 39 0 90902 28 0 90903 40 1 df2: ID AGE SEX Conc 909
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
尝试合并(df1,df2,by=“id”)
。这将把两个数据帧合并在一起。如果您的示例很好地表示了您的实际数据,那么您可能希望在合并之前从df2中删除年龄和性别列
df2$AGE <- NULL
df2$SEX <- NULL
df3 <- merge(df1, df2, by = "id")
df2$AGE您可以使用match
和lappy
进行此操作。如果我们在名称向量上对每个原始数据集的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
nm可能重复的谢谢大家!这太神奇了:-)我希望我能理解并使用apply系列函数。它们非常有用,但需要认真思考。如果有人能引导我找到一些有用的资源,那就太好了。有没有办法应用此方法,使其不会覆盖df2$AG中的任何非NA值E和df2$SEX?这个解决方案不知从何而来,为我节省了数小时的搜索时间。谢谢。这是可行的,但最初的数据帧有250Mb,现在有485Gb。。。
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