2014-12-04 103 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