【问题标题】:Is there a way to efficiently join two tables with keys stored on a list format有没有一种方法可以有效地将两个表与存储在列表格式中的键连接起来
【发布时间】:2021-08-26 17:04:02
【问题描述】:

在这里说明我的问题的代码示例。

table_A <- tibble(A1 = c("a", "a/b"), A2 = seq(1,2))
table_A <- table_A %>% mutate(A1 = str_split(A1, "/"))

table_B <- tibble(A1 = c("a","b"), B1 = c("apple", "bananas"))

#does not work
#left_join(table_A, table_B)

期望的结果是有一个新的 B1 列 c("apple") 和 c("apple", "bananas") 但显然这段代码不起作用。在实践中,列表的范围从无键到 5 个键长。 很高兴接受任何建议,也许有一种方法可以重新构建数据或问题来优雅地解决它。

【问题讨论】:

    标签: r list join dplyr tibble


    【解决方案1】:

    我们可以在加入之前unnestlist

    library(dplyr)
    library(tidyr)
    table_A %>% 
        unnest(A1) %>%
        left_join(table_B)
    

    -输出

    # A tibble: 3 x 3
      A1       A2 B1     
      <chr> <int> <chr>  
    1 a         1 apple  
    2 a         2 apple  
    3 b         2 bananas
    

    或者另一种选择是使用separate_rows 而不是strsplit 然后进行连接

    table_A %>% 
        separate_rows(A1, sep="/") %>%
        left_join(table_B)
    

    【讨论】:

      【解决方案2】:

      data.table 选项

      > rev(setDT(table_A)[, .(A1 = unlist(A1)), A2])[setDT(table_B), on = .(A1)]
         A1 A2      B1
      1:  a  1   apple
      2:  a  2   apple
      3:  b  2 bananas
      

      【讨论】:

        【解决方案3】:

        @akrun :感谢您的回复,这正是我想要的!

        为了在 table_C 下获得完全预期的结果,我只是在您的建议中添加了一条线:

        library(dplyr)
        library(tidyr)
        table_A <- tibble(A1 = c("a", "a/b"), A2 = seq(1,2))
        table_B <- tibble(A1 = c("a","b"), B1 = c("apple", "bananas"))
        
        table_C <- table_A %>% 
            separate_rows(A1, sep="/") %>%
            left_join(table_B) %>% 
            chop(c(A1,B1))
        
        table_C
        
        

        【讨论】:

          猜你喜欢
          • 2020-03-24
          • 2022-11-17
          • 1970-01-01
          • 2019-08-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多