【问题标题】:R: Join two tables (tibbles) by *list* columnsR:通过 *list* 列连接两个表(小标题)
【发布时间】:2017-10-08 18:16:18
【问题描述】:

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

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)

加入,by = c("x", "y")

inner_join_impl(x, y, by$x, by$y, suffix$x, suffix$y) 中的错误: 由于类型不兼容(列表/列表),无法加入 'x' x 'x'

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

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

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

【问题讨论】:

  • 那么有没有办法根据列表列执行连接,我不这么认为,不。你可以先计算一个唯一标识符并加入它。

标签: r list join tidyverse tibble


【解决方案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]>

【讨论】:

  • 很好,我刚刚写了一些类似的东西:uniqueIdentifier &lt;- function(l) paste(sort(l), collapse = " "),也使用了map_chr
  • tib1 y 中的第二个元素是c(10, 5) 时,我们可能会遇到错误,这意味着c(5, 10) 的顺序不同。如果用户不关心订单(在我的情况下是真的),您的方法需要一个额外的sort,就像在我的函数中一样。
猜你喜欢
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多