从数据框中的产品列表创建配对组合

时间:2017-05-23 13:32:36

标签: r dataframe dplyr combinations

我获得了他们在一段时间内使用过的用户和产品的数据:

dframe <- data.frame(id = c(1234,1234, rep(3456, 4)), 
                     product = c("Apple", "Pear", "Apple", "Pear", "Grapes", "Kiwi"))

  id product
1234   Apple
1234    Pear
3456   Apple
3456    Pear
3456  Grapes
3456    Kiwi

我正在寻找一种为每个用户创建产品对的独特组合的方法(其中x-y对等于y-x对)。解决方案看起来像这样:

solution
  id product1 product2
1234    Apple     Pear
3456    Apple     Pear
3456    Apple   Grapes
3456    Apple     Kiwi
3456     Pear   Grapes
3456     Pear     Kiwi
3456   Grapes     Kiwi

基本上,我想在dplyr combn(product,2)之后应用等效的group_by(id),如果这有意义的话。任何想法如何处理这个?

非常感谢你的帮助!

3 个答案:

答案 0 :(得分:3)

以下是使用CJ

data.table的选项
library(data.table)
setDT(dframe)[, product := as.character(product)
     ][, CJ(product1= product, product2 = product, unique = TRUE), 
  by = id][product1 != product2
  ][!duplicated(data.table(id, pmin(product1, product2), pmax(product1, product2)))]

答案 1 :(得分:2)

您可以找到有关唯一组合的一些函数in this post。如果我们借用@ Ferdinand.kraft

那个帖子定义的函数
expand.grid.unique <- function(x, y, include.equals=FALSE)
{
    x <- unique(x)

    y <- unique(y)

    g <- function(i)
    {
        z <- setdiff(y, x[seq_len(i-include.equals)])

        if(length(z)) cbind(x[i], z, deparse.level=0)
    }

    do.call(rbind, lapply(seq_along(x), g))
}

然后我们可以通过dplyr使用它,如下所示,

library(dplyr)

 dframe %>% 
   group_by(id) %>% 
   do(as.data.frame(expand.grid.unique(as.character(.$product), as.character(.$product))))

#Source: local data frame [7 x 3]
#Groups: id [2]

#     id     V1     V2
#  <dbl>  <chr>  <chr>
#1  1245  Apple   Pear
#2  3456  Apple   Pear
#3  3456  Apple Grapes
#4  3456  Apple   Kiwi
#5  3456   Pear Grapes
#6  3456   Pear   Kiwi
#7  3456 Grapes   Kiwi

答案 2 :(得分:2)

以下是Is your extension signed? group_by %>% do的选项:

combn