簡體   English   中英

根據ID將一個數據框的行合並為另一數據框的多列

[英]Merge rows of one data frame into multiple columns of another based on an ID

我有一個具有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))

我相信這應該做到。 通過使用all.x = TRUE,您可以像執行SQL的左外部聯接一樣進行合並。

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

我認為您可以先使用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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM