代码之家  ›  专栏  ›  技术社区  ›  TarJae

如何通过匹配相同的字符串来连接两个长度不等的列

  •  1
  • TarJae  · 技术社区  · 5 月前

    我有两个具有唯一值的tibble,长度不等,例如:

    df1 <- structure(list(col1 = c("A", "T", "C", "D", "X", "F")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -6L))
    df2 <- structure(list(col2 = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -10L))
    
    > df1
    # A tibble: 6 × 1
      col1 
      <chr>
    1 A    
    2 T    
    3 C    
    4 D    
    5 X    
    6 F 
    
    > df2
    # A tibble: 9 × 1
      col2 
      <chr>
    1 A    
    2 B    
    3 C    
    4 D    
    5 F    
    6 G    
    7 H    
    8 I    
    9 J   
    

    我想得到:

    > df3
    # A tibble: 11 × 2
       col1  col2 
       <chr> <chr>
     1 A     A    
     2 NA    B    
     3 T     NA   
     4 C     C    
     5 D     D    
     6 X     NA   
     7 F     F    
     8 NA    G    
     9 NA    H    
    10 NA    I    
    11 NA    J
    

    df1的col1和df2的col2中的每个相同字符串应该并排在同一行中。例如,如果col1和col2中的字符串相同,则它们应该在同一行中(例如字符串a)。 如果字符串存在于col1中,但不存在于col2中,则col2中的字符串应为NA,反之亦然。

    如有任何进一步的建议,我将不胜感激。

    2 回复  |  直到 5 月前
        1
  •  5
  •   Seth    5 月前
    library(dplyr)
    
    full_join(df1, df2, by = join_by(col1 == col2), keep = TRUE)
    #> # A tibble: 12 × 2
    #>    col1  col2 
    #>    <chr> <chr>
    #>  1 A     A    
    #>  2 T     <NA> 
    #>  3 C     C    
    #>  4 D     D    
    #>  5 X     <NA> 
    #>  6 F     F    
    #>  7 <NA>  B    
    #>  8 <NA>  E    
    #>  9 <NA>  G    
    #> 10 <NA>  H    
    #> 11 <NA>  I    
    #> 12 <NA>  J
    
        2
  •  2
  •   ThomasIsCoding    5 月前

    基础R解决方案

    lst <- c(df1, df2)
    v <- unique(unlist(lst))
    list2DF(lapply(lst, \(x) x[match(v, x)]))
    

    给予

       col1 col2
    1     A    A
    2     T <NA>
    3     C    C
    4     D    D
    5     X <NA>
    6     F    F
    7  <NA>    B
    8  <NA>    E
    9  <NA>    G
    10 <NA>    H
    11 <NA>    I
    12 <NA>    J