这是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
a
和b
不会一起发生,a
和c
4次(第2,4,5,6行)和b
以及{ {1}}两次(第3行和第7行)所以我想要返回
c
我希望这有道理吗?提前致谢
答案 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))