我获得了他们在一段时间内使用过的用户和产品的数据:
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)
,如果这有意义的话。任何想法如何处理这个?
非常感谢你的帮助!
答案 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