R:通过* list *列加入两个表(tibbles)

时间:2017-05-10 08:01:10

标签: 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)
  

加入,by = c(&#34; x&#34;,&#34; y&#34;)

     

inner_join_impl(x,y,$ x,$ y,后缀$ x,后缀$ y)出错:         无法加入&#39; x&#39; x&#39; x&#39;因为不兼容的类型(列表/列表)

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

基本上,如果两个关键变量的列表相同,我希望行包含在最终表中,如果不包含 - 不是。在上面的示例中,有两个关键变量xy,结果应该只是两个tibble中的第一行,因为它是两个tibble(x = list(1), y = list(4)) # A tibble: 1 × 2 x y <list> <list> 1 <dbl [1]> <dbl [1]> 中唯一相同的一行关键变量:

Setex-Header layer 1
========================================================

Setex-Header layer 2
------------

### Atx-Header layer 3

#### Atx-Header layer 4

1 个答案:

答案 0 :(得分:2)

我们可以使用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)))

dplyr::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]>