根据ID将一个数据框的行合并为另一数据框的多列

时间:2019-02-01 16:18:57

标签: r

我有一个具有ID号和相应数据的数据框,其中一些ID号在多行中重复,并且我想将此数据框与每行一个ID号的另一个数据框合并。因此,结果是向每行/ ID添加多列以覆盖重复项。

我一直在尝试merge()和aggregate()函数,以使其正常工作,但是并没有达到我想要的效果。我还花了很多时间搜索堆栈溢出以找到解决方案,却一无所获。

这是第一个数据帧的样子:

df1 <- data.frame(ID = c(90051, 90051, 90051, 90229, 90229, 91120, 91120, 89649), 
              SPP = c("ABLA", "PICO", "POTR5", "ABLA", "PICO", "ABLA", "POTR5", "ABLA"), 
              COUNT = c(5, 4, 1, 7, 1, 3, 5, 11))

这就是我要修改的数据框的样子

df2 <- data.frame(ID = c(85470, 90051, 90229, 91120, 89649, 84364), 
              COUNTY = c(49, 57, 107, 107, 117, 37), STATUS = c(1, 1, 1, 2, 1, 3))

这就是我希望得到的数据框看起来像

df3 <- data.frame(ID = c(85470, 90051, 90229, 91120, 89649, 84364), 
              COUNTY = c(49, 57, 107, 107, 117, 37), STATUS = c(1, 1, 1, 2, 1, 3),
              ABLA = c(NA, 5, 7, 3, 11, NA), PICO = c(NA, 4, 1, NA, NA, NA), POTR5 = c(NA, 7, NA, 5, NA, NA))

2 个答案:

答案 0 :(得分:0)

我相信这应该做到。通过使用all.x = TRUE,您可以像执行SQL左外连接那样进行合并。

merge(x = df1, y = df2, by = "ID", all.x = TRUE)

答案 1 :(得分:0)

我认为您可以先使用spread,然后再进行right_join

library(tidyr)
library(dplyr)

result <- spread(df1, key = SPP, value = COUNT) %>%
  right_join(df2, by = "ID")

为您提供理想的结果:

> result
     ID ABLA PICO POTR5 COUNTY STATUS
1 85470   NA   NA    NA     49      1
2 90051    5    4     1     57      1
3 90229    7    1    NA    107      1
4 91120    3   NA     5    107      2
5 89649   11   NA    NA    117      1
6 84364   NA   NA    NA     37      3