获取矩阵的行(或列)按表格计数(如表())

时间:2015-10-12 05:50:18

标签: r count

给定具有已知不同值的矩阵(或可能是数据框)(在它下面是' a''''''和& #39; d')例如:

m<- matrix(c('a','b','a',
         'b','c','a',
         'b','a','a',
         'b','c','d'), nrow=4,byrow=T)

> m
     [,1] [,2] [,3]
[1,] "a"  "b"  "a" 
[2,] "b"  "c"  "a" 
[3,] "b"  "a"  "a" 
[4,] "b"  "c"  "d" 

如何获取每列(或行)的值的计数(或列比例),并将其输出到(在此示例中)4x3矩阵(或数据帧)中,其中第一行计为& #39;一个&#39;在m等的列中:

      [,1] [,2] [,3]
a    1    1    3
b    3    1    0
c    0    2    0
d    0    0    1

想知道是否可以使用apply(m,2,table)使用魔法?应该说m可能非常大(1e4 x 30),但不同值的数量总是小于40。

2 个答案:

答案 0 :(得分:3)

我们使用melt中的library(reshape2)将矩阵从宽转换为长,然后执行table

library(reshape2)
table(melt(m)[3:2])
#      Var2
#value 1 2 3
#   a 1 1 3
#   b 3 1 0
#   c 0 2 0
#   d 0 0 1

如果我们需要比例,我们可以使用prop.table并相应地更改保证金。

prop.table(table(melt(m)[3:2]),1)

另一个方便的功能是来自mtabulate

library(qdapTools)
library(qdapTools)
t(mtabulate(as.data.frame(m)))

答案 1 :(得分:2)

或使用tablecol(m)

table(c(m),col(m))

#m   1 2 3
#  a 1 1 3
#  b 3 1 0
#  c 0 2 0
#  d 0 0 1

c(m) vs m就可以通过更大的表格显着提高速度。这与@ akrun的解决方案相比具有竞争力:

m <- matrix(sample(letters[1:3], 5000*200, replace=TRUE), ncol=5000)
system.time(table(c(m),col(m)))
# user  system elapsed 
# 0.63    0.02    0.64 
system.time(table(melt(m)[3:2]))
# user  system elapsed 
# 0.36    0.00    0.36