我遇到了一个问题,我知道如何使用SQL解决,但我希望在 R 中使用新数据集实现解决方案。我一直在尝试使用reshape2包来解决问题,但我对我想要完成的事情没有任何好运。这是我的问题:
我有一个数据集,我需要在其中查看另一组中的所有项目对。我在下面创建了一个玩具示例以进一步解释。
BUNCH FRUITS
1 apples
1 bananas
1 mangos
2 apples
3 bananas
3 apples
4 bananas
4 apples
我想要的是列出所有可能的对,并将它们在一堆中出现的频率相加。我的输出理想情况如下:
FRUIT1 FRUIT2 FREQUENCY
APPLES BANANAS 3
APPLES MANGOS 1
我的最终目标是制作一些我最终能够导入Gephi进行网络分析的东西。为此,我需要一个Source和Target列(又名上面的FRUIT1和FRUIT2)。
如果可以帮助任何人,那么SQL中的原始解决方案就在这里:PROC SQL in SAS - All Pairs of Items
答案 0 :(得分:0)
以下似乎有效:
tmp = table(DF$FRUITS, DF$BUNCH) != 0
#> tmp
# 1 2 3 4
# apples TRUE TRUE TRUE TRUE
# bananas TRUE FALSE TRUE TRUE
# mangos TRUE FALSE FALSE FALSE
do.call(rbind,
combn(unique(as.character(DF$FRUITS)),
2,
function(x) data.frame(fr1 = x[1],
fr2 = x[2],
freq = sum(colSums(tmp[x, ]) == 2)),
simplify = F))
# fr1 fr2 freq
#1 apples bananas 3
#2 apples mangos 1
#3 bananas mangos 1
DF
:
DF = structure(list(BUNCH = c(1L, 1L, 1L, 2L, 3L, 3L, 4L, 4L), FRUITS = structure(c(1L,
2L, 3L, 1L, 2L, 1L, 2L, 1L), .Label = c("apples", "bananas",
"mangos"), class = "factor")), .Names = c("BUNCH", "FRUITS"), class = "data.frame", row.names = c(NA,
-8L))