@ user1317221_G からの回答がまさに探しているものであるかどうかが出力例から明らかではないため、このアプローチをお勧めします。その例では、組み合わせは4回2 3
カウントされ、 は 2 回、 は 2 回カウントされます。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