在dplyr或tidyr中执行类似于rbind的操作?

时间:2014-08-04 05:19:37

标签: r dplyr rbind tidyr

请注意以下数据,我对每个水果有多少独特合作伙伴的问题感兴趣?

我的df:

       fruit1 fruit2
    1   guava   kiwi
    2   lemon   pear
    3    pear  apple
    4   guava   kiwi
    5    pear  guava
    6   apple   kiwi
    7  banana  lemon
    8   lemon   kiwi
    9   apple banana
    10  lemon  guava

我正在努力掌握dplyr和tidyr。为此,我认为在dplyr中使用n_distinct()会很好。我做了以下事情:

rbind (df %>%select(fruita=fruit1,fruitb=fruit2), 
       df %>%select(fruita=fruit2,fruitb=fruit1)) %>%
  group_by(fruita) %>%
  summarise(Partners=n_distinct(fruitb)) %>%
  arrange(desc(Partners))

这基本上复制了下面的10行,但是在下半部分切换了水果的顺序。然后我计算新第一列中的每个水果,使用n_distinct()在新的第二列中有多少独特的合作伙伴水果。

这样做很好,但考虑到dplyrtidyr的优雅程度,我想知道是否有更有效的方法可以做到这一点,特别是如果有办法执行{{{ 1}}比如使用其中一个包吗?

最终数据如下所示:

rbind

复制数据:

  fruita Partners
1  lemon        4
2  apple        3
3  guava        3
4   pear        3
5   kiwi        3
6 banana        2

1 个答案:

答案 0 :(得分:7)

不确定这是否有帮助:

df %>% 
do(data.frame(fruita=unlist(.), fruitb=unlist(.[,2:1]))) %>%
group_by(fruita) %>% 
summarise(Partners=n_distinct(fruitb)) %>% 
arrange(desc(Partners))
#Source: local data frame [6 x 2]

#    fruita Partners
#  1  lemon        4
#  2  apple        3
#  3  guava        3
#  4   pear        3
#  5   kiwi        3
#  6 banana        2