我有一个包含三列的数据表。前两个是数据点的集合(可以是A,B或C的分类数据)。第三列是两个数据点的集合,因为它们属于一个集合。我需要获取可能组合的计数,并且需要将“ A&C”与“ C&A”作为同一组的一部分进行计数,因为这些对的顺序无关紧要。
之前,我设置了一个列,将“ CAT1&CAT2”和另一个列为“ CAT2&CAT1”连接起来,希望在那里进行汇总,但是这些数字当然并不能正确地相加。
library(data.table)
dt1 = data.table(CAT1 = c('a','b','c','b','a','c','c','b','a','c'),
CAT2 = c('a','b','c','a','b','c','a','b','c','a'))
dt1[,merged := paste(dt1$CAT1, dt1$CAT2, sep = ' & ')]
counts = data.table(table(dt1$merged))
输出表“ counts”为我提供了合并列的所有唯一性,但是我需要在翻转数据点的任何地方进行总结(“ A&C” +“ C&A”)。我知道可以手动完成此操作,但是我要手工完成的实际数据点太多。
答案 0 :(得分:1)
dt1[,paste(sort(c(CAT1,CAT2)),collapse=" & "),by=1:nrow(dt1)][,table(V1)]
答案 1 :(得分:0)
我对data.table不好,所以这是我对data.frame的回答:
只需在粘贴前对两个CAT进行排序,确保它们始终处于相同顺序。
dt1$merged<-apply(dt1,1,function(x) paste(sort(x),collapse=" & "))
我确定可以使用更快的方法来处理data.table,但不确定如何。天真的sort
添加到您的代码中时出现了错误...
答案 2 :(得分:0)
您还可以执行以下操作-
注意:如@ chinsoon12所述,我们可以使用pmin
和pmax
> setDT(dt1)[,list(Count=.N) ,paste(pmin(CAT1, CAT2), pmax(CAT1, CAT2), sep=' & ')]
paste Count
1: a & a 1
2: b & b 2
3: c & c 2
4: a & b 2
5: a & c 3