组内的观察结果

时间:2014-03-18 18:44:42

标签: r dataset

我遇到了一个问题,我知道如何使用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

1 个答案:

答案 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))