计数事件时间组合的数量出现在dataframe列ext中

时间:2013-03-18 11:34:56

标签: r dataframe combinations

这是Count number of times combination of events occurs 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

ab不会一起发生,ac 4次(第2,4,5,6行)和b以及{ {1}}两次(第3行和第7行)所以我想要返回

c

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

3 个答案:

答案 0 :(得分: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将消除排序的影响(a-c处理与c-a相同)。

df1 = as.data.frame(t(apply(df,1,sort)))

答案 1 :(得分:1)

如上所述,您可以使用factor()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))

答案 2 :(得分: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))