我建议采用这种方法,因为从您的示例输出中不清楚来自 @user1317221_G 的答案是否正是您正在寻找的。在该示例中,该组合2 3
被计数4次,两次为item1 = 2, item2 = 3
,两次为item1 = 3, item2 = 2
。
我会尝试这个combn
功能。它不会为您提供与您正在寻找的完全相同的输出,但可能可以针对该目的进行调整。
这是一个例子。
编写一个基本函数,它将生成我们给它的任何组合。
myfun = function(x) { apply(combn(x, 2), 2, paste, sep="", collapse="") }
split()
您的item
数据列,id
并用于lapply
在其中生成组合id
。
temp = split(df$item, df$id)
# Drop any list items that have only one value--combn won't work there!
temp = temp[-(which(sapply(temp,function(x) length(x) == 1),
arr.ind=TRUE))]
temp1 = lapply(temp, function(x) myfun(unique(x)))
使用unlist
和 然后table
将每个组合的频率制成表格。
table(unlist(temp1))
#
# 12 13 23
# 1 1 2
data.frame
如果你愿意,你可以拥有一个。
data.frame(table(unlist(temp)))
# Var1 Freq
# 1 12 1
# 2 13 1
# 3 23 2
更新
如前所述,使用更多的肘部油脂,您也可以使用此方法来匹配您想要的输出:
myfun = function(x) { apply(combn(x, 2), 2, paste, sep="", collapse=",") }
temp = split(df$item, df$id)
temp = temp[-(which(sapply(temp,function(x) length(x) == 1),
arr.ind=TRUE))]
temp1 = lapply(temp, function(x) myfun(unique(x)))
temp1 = data.frame(table(unlist(temp1)))
OUT = data.frame(do.call(rbind,
strsplit(as.character(temp1$Var1), ",")),
temp1$Freq)
names(OUT) = c("item1", "item2", "count")
OUT
# item1 item2 count
# 1 1 2 1
# 2 1 3 1
# 3 2 3 2