【问题标题】:filling in columns with matching IDs from two dataframes in R从 R 中的两个数据帧中填充具有匹配 ID 的列
【发布时间】:2014-08-28 01:22:24
【问题描述】:

我有两个数据框(df1、df2)。我想填写从 df1 到 df2 的 AGE 和 SEX 值,条件是两者之间的 ID 相同。我尝试了几种使用 for-loop 并检查两个数据帧之间的主题 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

【问题讨论】:

标签: r


【解决方案1】:

您可以为此使用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 快很多。

【讨论】:

  • 有没有办法应用这种方法,这样它就不会覆盖 df2$AGE 和 df2$SEX 中的任何非 NA 值?
  • 不知从何而来,这个解决方案为我节省了数小时的搜索时间。谢谢。
  • 这行得通,但初始数据帧有 250Mb,现在有 485Gb...
【解决方案2】:

试试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 函数)的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多