2014-12-04 77 views
1

我有一个矩阵matR:计数矩阵行的匹配数

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列1个匹配的a矢量,在矩阵的第3行中匹配a

回答

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))) 
+0

谢谢。这正是我所期待的。 – cooldood3490 2014-12-04 03:33:42

+0

@AnandaMahto谢谢,我会更新它。 – akrun 2014-12-04 04:00:15

2

如果你想为所有值执行此操作,您可以尝试以下操作之一:

tablefactorapply

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 

meltdcastfun.aggregate = length从 “reshape2”

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