获取矩阵的行(或列)表格化计数(如 table())
Get the row (or column)-wise tabularized counts (as in table()) of a matrix
给定一个具有已知不同值的矩阵(或者可以是数据框)(下面是 '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。
我们使用 library(reshape2)
中的 melt
将矩阵从宽矩阵转换为长矩阵,然后执行 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)))
或使用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
给定一个具有已知不同值的矩阵(或者可以是数据框)(下面是 '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。
我们使用 library(reshape2)
中的 melt
将矩阵从宽矩阵转换为长矩阵,然后执行 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)))
或使用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