给定具有已知不同值的矩阵(或可能是数据框)(在它下面是' 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。
答案 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)
或使用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)
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