0

这是Count number of times combination of events occur in dataframe columns 中提出的问题的扩展,我将再次改写这个问题,所以一切都在这里:

我有一个数据框,我想计算两列中每个事件组合发生的次数(以任何顺序),如果组合没有出现,则为零。

例如说我有

df <- data.frame('x' = c('a', 'b', 'c', 'c', 'c'), 
                 'y' = c('c', 'c', 'a', 'a', 'b'))

所以

x y  
a c  
b c  
c a  
c a  
c a  
c b

a并且b不要一起出现,a并且c4 次(第 2、4、5、6 行)bc两次(第 3 和第 7 行)所以我想返回

x-y num  
a-b 0  
a-c 4  
b-c 2  

我希望这是有道理的?提前致谢

4

3 回答 3

4

这应该这样做:

res = table(df)

要转换为数据框:

resdf = as.data.frame(res)

resdf data.frame 看起来像:

  x y Freq
1 a a    0
2 b a    0
3 c a    2
4 a b    0
5 b b    0
6 c b    1
7 a c    1
8 b c    1
9 c c    0

请注意,此答案考虑了顺序。如果列的顺序不重要,那么在处理之前修改原始 data.frame 将消除排序的影响(ac 与 ca 处理相同)。

df1 = as.data.frame(t(apply(df,1,sort)))
于 2013-03-18T11:39:56.730 回答
1

如前所述,您可以使用factor()and expand.grid()(或获得所有可能组合的其他方式)来执行此操作

all.possible <- expand.grid(c('a','b','c'), c('a','b','c'))
all.possible <- all.possible[all.possible[, 1] != all.possible[, 2], ]
all.possible <- unique(apply(all.possible, 1, function(x) paste(sort(x), collapse='-')))

df <- data.frame('x' = c('a', 'b', 'c', 'c', 'c'), 
                 'y' = c('c', 'c', 'a', 'a', 'b'))
table(factor(apply(df , 1, function(x) paste(sort(x), collapse='-')), levels=all.possible))
于 2013-03-18T11:43:42.260 回答
0

另一种选择,因为我有点无聊。或许更笼统一些?但可能仍然比它可能的丑...

df2 <- as.data.frame(table(df))
df2$com <- apply(df2[,1:2],1,function(x) if(x[1] != x[2]) paste(sort(x),collapse='-'))
df2 <- df2[df2$com != "NULL",]
ddply(df2, .(unlist(com)), summarise, 
      num = sum(Freq))
于 2013-03-18T12:19:59.690 回答