获取矩阵的行(或列)表格化计数(如 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】:或者使用table
和col(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() 中)的主要内容,如果未能解决你的问题,请参考以下文章