【问题标题】:Merging same column from a dataset onto all of the columns of another in R?将数据集中的同一列合并到R中另一个的所有列?
【发布时间】:2020-07-16 19:23:55
【问题描述】:

我正在尝试对同一数据集中的不同列进行多次合并/连接,但是当我这样做时,输出完全错误。

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 上,我想得到的输出看起来像

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)

但是它并没有按照我认为的方式工作。有没有我不知道的可以像这样干净地合并的更简单的功能?

【问题讨论】:

  • 预期输出是否正确
  • 为什么df1 的第3 行匹配3 而不是4

标签: r join merge


【解决方案1】:

根据显示的输出,似乎对于每一行,我们需要获取 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))

【讨论】:

    【解决方案2】:

    您可以使用 dplyr 包中的 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
    

    【讨论】:

      猜你喜欢
      • 2018-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2022-11-13
      • 2020-12-24
      • 2023-02-24
      • 2013-07-31
      相关资源
      最近更新 更多