获取矩阵的行(或列)表格化计数(如 table() 中)

Posted

技术标签:

【中文标题】获取矩阵的行(或列)表格化计数(如 table() 中)【英文标题】:Get the row (or column)-wise tabularized counts (as in table()) of a matrix 【发布时间】:2016-01-09 12:23:10 【问题描述】:

给定一个具有已知不同值的矩阵(或可能是一个数据框)(其下方是“a”、“b”、“c”和“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 矩阵(或数据框)中,其中第一行是计数' a' 在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。

【问题讨论】:

抱歉,没听懂。这些值是如何得出的? 对不起各位,忘记了 byrow=T。请看我的编辑 【参考方案1】:

我们使用 melt from 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 from library(qdapTools)

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

【讨论】:

如此简单优雅!我相信这正是我想要的。【参考方案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)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 

【讨论】:

以上是关于获取矩阵的行(或列)表格化计数(如 table() 中)的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL表格怎么显示隐藏的行或列

求助,怎么通过js获取slickgrid表格中的行数,选中行和一行中的数据

matlab获取矩阵和向量长度length和size

如何交换二维数组中的行或列?

“matlab”矩阵的长度怎么计算?

表头多级表头及单元格合并,表格合并行或列