用R中两个 Dataframe 的匹配ID填充列

jxct1oxe  于 2023-06-19  发布在  其他
关注(0)|答案(3)|浏览(213)

我有两个 Dataframe (df1,df2)。我想填写年龄和性别的值从df1到df2的条件是有相同的ID之间的两个。我尝试了几种方法,使用for循环和检查两个 Dataframe 之间的主题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
xfb7svmp

xfb7svmp1#

您可以将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快得多。

06odsfpq

06odsfpq2#

试试merge(df1, df2, by = "id")这将把两个数据框合并在一起。如果您的示例很好地表示了您的实际数据,那么在合并之前,您可能需要继续删除df2中的age和sex列。

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

lf5gs5x2

lf5gs5x23#

下面是dplyr(v1.0.0)方法,它只覆盖df2中的NA值:

rows_patch(df2 %>%mutate(across(AGE:SEX,as.integer)),df1)

     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

相关问题