簡體   English   中英

將數據集中的同一列合並到 R 中另一列的所有列?

[英]Merging same column from a dataset onto all of the columns of another in R?

我正在嘗試對同一數據集中的不同列進行多次合並/連接,但是當我這樣做時,output 是完全錯誤的。

df1                 df2
P1  P2  P3  P4      P   Output  
A   B   C           C   1                 
A   B               B   2          
E   F   G   H       H   3
E                   E   4

我正在嘗試將 df2 合並到 df1 上,我想得到的 output 看起來像

df3
P1  P2 P3  P4  Output   
A   B  C   NA  1
A   B  NA  NA  2
E   F  G   H   3
E   NA NA  NA  4

我試過了

df3<- merge(df1,df2, by.x = "P1", by.y = "P", all.x = T, all.y = T)
df3<- merge(df1,df2, by.x = "P2", by.y = "P", all.x = T, all.y = T)
df3<- merge(df1,df2, by.x = "P3", by.y = "P", all.x = T, all.y = T)
df3<- merge(df1,df2, by.x = "P4", by.y = "P", all.x = T, all.y = T)

但是它並沒有按照我認為的方式工作。 有沒有更簡單的 function 可以像我不知道的那樣干凈地合並?

基於 output 顯示,似乎對於每一行,我們需要獲取last非 NA 元素並與第二個 data.frame 'P' 列進行match以獲得相應的 'Output'。 如果是這樣的邏輯,

df3 <- df1
df3$Output <- apply(df1, 1, function(x) 
        setNames(df2$Output, df2$P)[tail(x[!is.na(x)], 1)])

或者使用tidyverse

library(dplyr)
library(tidyr)
df1 %>%
   mutate(rn = row_number()) %>%
   pivot_longer(cols = -rn, values_drop_na = TRUE) %>% 
   group_by(rn) %>%
   slice(n()) %>%
   ungroup %>% 
   left_join(df2, by = c('value' = 'P')) %>% 
   select(Output) %>% 
   bind_cols(df1, .)

數據

df1 <- structure(list(P1 = c("A", "A", "E", "E"), P2 = c("B", "B", "F", 
NA), P3 = c("C", NA, "G", NA), P4 = c(NA, NA, "H", NA)), class = "data.frame", 
row.names = c(NA, 
-4L))

df2 <- structure(list(P = c("C", "B", "H", "E"), Output = 1:4), 
class = "data.frame", row.names = c(NA, 
-4L))

您可以使用dplyr package 中的coalesce在 df1 中創建一個新字段,這將是兩個數據集之間的鍵。

library(dplyr)
#create column P, which takes first non null value
df1$P <- coalesce(df1$P4,df1$P3,df1$P2,df1$P1)
#Join data frames on P
df3 <- inner_join(df1, df2, by='P')
#Rmove P from df3
df3$P <- NULL

>> df3
  P1   P2   P3   P4 Output
1  A    B    C <NA>      1
2  A    B <NA> <NA>      2
3  E    F    G    H      3
4  E <NA> <NA> <NA>      4

暫無
暫無

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

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