用table()计数并排除0

时间:2016-06-07 12:39:34

标签: r count

我试着计算三胞胎;为此,我使用三个包装在数据帧中的向量:

X=c(4,4,4,4,4,4,4,4,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,3)              
Y=c(1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,4,2,2,2,2,3,4,1,1,2,2,3,3,4,4)
Z=c(4,4,5,4,4,4,4,4,6,1,1,1,1,1,1,1,2,2,2,2,7,2,3,3,3,3,3,3,3,3)


Count_Frame=data.frame(matrix(NA, nrow=(length(X)), ncol=3))

Count_Frame[1]=X
Count_Frame[2]=Y
Count_Frame[3]=Z

Counts=data.frame(table(Count_Frame))

存在以下问题:如果我增加向量中的值范围或使用更多向量,则“计数”数据帧由于许多0计数而快速接近其大小限制。有没有办法在生成“计数”时排除0计数?

4 个答案:

答案 0 :(得分:3)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(Count_Frame)),按所有列(.(X, Y, Z))分组,我们得到一些或多行(.N)。

library(data.table)
setDT(Count_Frame)[,.N ,.(X, Y, Z)]
#    X Y Z N
# 1: 4 1 4 7
# 2: 4 1 5 1
# 3: 1 1 6 1
# 4: 1 1 1 3
# 5: 1 2 1 2
# 6: 1 3 1 1
# 7: 1 4 1 1
# 8: 2 2 2 4
# 9: 2 3 7 1
#10: 2 4 2 1
#11: 3 1 3 2
#12: 3 2 3 2
#13: 3 3 3 2
#14: 3 4 3 2

我们也可以使用names(Count_Frame)(如果有很多列),而不是命名所有列

setDT(Count_Frame)[,.N , names(Count_Frame)]

答案 1 :(得分:2)

您可以使用aggregate完成此操作:

Count_Frame$one <- 1
aggregate(one ~ X1 + X2 + X3, data=Count_Frame, FUN=sum)

这将计算table的正实例,但不会列出零计数。

答案 2 :(得分:2)

一种解决方案是创建列值的组合并改为计算:

library(tidyr)
as.data.frame(table(unite(Count_Frame, tmp, X1, X2, X3))) %>%
  separate(Var1, c('X1', 'X2', 'X3'))

产生的结果是:

   X1 X2 X3 Freq
1   1  1  1    3
2   1  1  6    1
3   1  2  1    2
4   1  3  1    1
5   1  4  1    1
6   2  2  2    4
7   2  3  7    1
8   2  4  2    1
9   3  1  3    2
10  3  2  3    2
11  3  3  3    2
12  3  4  3    2
13  4  1  4    7
14  4  1  5    1

答案 3 :(得分:2)

或使用plyr

library(plyr)
count(Count_Frame, colnames(Count_Frame))

输出

# > count(Count_Frame, colnames(Count_Frame))
   # X1 X2 X3 freq
# 1   1  1  1    3
# 2   1  1  6    1
# 3   1  2  1    2
# 4   1  3  1    1
# 5   1  4  1    1
# 6   2  2  2    4
# 7   2  3  7    1
# 8   2  4  2    1
# 9   3  1  3    2
# 10  3  2  3    2
# 11  3  3  3    2
# 12  3  4  3    2
# 13  4  1  4    7
# 14  4  1  5    1