我有一个矩阵mat
。
mat<-matrix(
c('a','a','b','a','b','b'),
nrow=3, ncol=2)
我想在矩阵的每一行中创建计数匹配的向量。例如,假设我想计算每行中a
字母的匹配数。矩阵的第一行有a
,a
:a
的两个匹配。矩阵的第二行有a
,b
:a
的一个匹配。
我可以使用以下代码行计算连续字符a
的匹配数:
sum(!is.na(charmatch(mat[1,c(1,2)],"a"))) # first row, returns 2
sum(!is.na(charmatch(mat[2,c(1,2)],"a"))) # second row, returns 1
我想对这个计数程序进行矢量化。换句话说,我想做这样的事情
as.vector(rowsum(!is.na(charmatch(mat[,c(1,2)], "a"))))
这样它返回一个像2,1,0
这样的向量,这意味着矩阵的第1行中a
的2个匹配,矩阵的第2行中的a
的1个匹配,0匹配在矩阵的第3行中a
。
答案 0 :(得分:3)
你可以做到
rowSums(mat=='a', na.rm=TRUE)
#[1] 2 1 0
适用于所有unique
值
Un <- sort(unique(c(mat)))
res <- sapply(Map(`==`, list(mat), Un), rowSums, na.rm=TRUE)
colnames(res) <- Un
res
# a b
#[1,] 2 0
#[2,] 1 1
#[3,] 0 2
或者由@Ananda Mahto提供,更快的方法是
lvl <- sort(unique(c(mat)))
vapply(lvl, function(x) rowSums(mat == x, na.rm = TRUE), numeric(nrow(mat)))
答案 1 :(得分:2)
如果要对所有值执行此操作,可以尝试以下操作之一:
在table
中使用factor
的 apply
levs <- unique(c(mat))
t(apply(mat, 1, function(x) table(factor(x, levs))))
# a b
# [1,] 2 0
# [2,] 1 1
# [3,] 0 2
来自“reshape2”的 melt
和dcast
以及fun.aggregate = length
library(reshape2)
dcast(melt(mat), Var1 ~ value, value.var = "Var2")
# Aggregation function missing: defaulting to length
# Var1 a b
# 1 1 2 0
# 2 2 1 1
# 3 3 0 2
在手动创建值列表后,最好还是table
:
table(rep(sequence(nrow(mat)), ncol(mat)), c(mat))
#
# a b
# 1 2 0
# 2 1 1
# 3 0 2