R:通过 *list* 列连接两个表(tibbles)

标签 r list join tidyverse tibble

似乎应该有一个简单的答案,但我一直找不到:

tib1 <- tibble(x = list(1, 2, 3), y = list(4, 5, 6))
tib1
# A tibble: 3 × 2
      x         y
 <list>    <list>
1 <dbl [1]> <dbl [1]>
2 <dbl [1]> <dbl [1]>
3 <dbl [1]> <dbl [1]>

tib2 <- tibble(x = list(1, 2, 4, 5), y = list(4, c(5, 10), 6, 7))
tib2
# A tibble: 4 × 2
      x         y
 <list>    <list>
1 <dbl [1]> <dbl [1]>
2 <dbl [1]> <dbl [2]>
3 <dbl [1]> <dbl [1]>
4 <dbl [1]> <dbl [1]>

dplyr::inner_join(tib1, tib2)

Joining, by = c("x", "y")

Error in inner_join_impl(x, y, by$x, by$y, suffix$x, suffix$y) : Can't join on 'x' x 'x' because of incompatible types (list / list)

那么有没有一种方法可以基于 list 列执行连接(在我开始编写自己的列之前)?

基本上,如果两个关键变量的列表相同,我希望该行包含在最终表中,如果不相同,则不。在上面的示例中,有两个关键变量 xy,结果应该只是两个 tibble 的第一行,因为它是两个关键变量中只有一个相同:

tibble(x = list(1), y = list(4))
# A tibble: 1 × 2
      x         y
 <list>    <list>
1 <dbl [1]> <dbl [1]>

最佳答案

我们可以使用来自 digest 的散列:

tib1 <- tibble(x = list(1, 2, 3), y = list(4, 5, 6))
tib2 <- tibble(x = list(1, 2, 4, 5), y = list(4, c(5, 10), 6, 7))

tib1 <- mutate_all(tib1, funs(hash = map_chr(., digest::digest)))
tib2 <- mutate_all(tib2, funs(hash = map_chr(., digest::digest)))

inner_join(tib1, tib2, c('x_hash', 'y_hash')) %>%
  select(x.x, x.y)
# A tibble: 1 × 2
        x.x       x.y
     <list>    <list>
1 <dbl [1]> <dbl [1]>

关于R:通过 *list* 列连接两个表(tibbles),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43886700/

相关文章:

c# - 使用C#从文件夹中获取所有文件名

mysql - Express js + Sequelize 查询

SQL 连接与 SQL 子查询(性能)?

r - 如何在不使用科学记数法的情况下在R数据框中显示数字列('e+07')

R:如何通过 install_github() 安装特定版本?

r - 在 R 中向列表中添加元素的最快方法

mysql - 使用 JOIN 进行复杂 SQL 查询

r - 在R中编写tryCatch的简单版本

r - 在 R 中使用多核和 doMC 时如何标记我的子进程以进行日志记录

c - 删除列表C中的奇数