R:计算矩阵行中的匹配数

时间:2014-12-04 03:28:22

标签: r matrix character row

我有一个矩阵mat

mat<-matrix(
c('a','a','b','a','b','b'),  
nrow=3, ncol=2)

我想在矩阵的每一行中创建计数匹配的向量。例如,假设我想计算每行中a字母的匹配数。矩阵的第一行有aaa的两个匹配。矩阵的第二行有aba的一个匹配。

我可以使用以下代码行计算连续字符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

2 个答案:

答案 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”的

meltdcast以及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