2014-12-04 3 views
1

У меня есть матрица mat.R: количество совпадений в строке матрицы

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, что означает 2 матча a в строке 1 матрицы, 1 матч a в строке 2 матрицы , 0 совпадений a в строке 3 матрицы.

ответ

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

+0

@AnandaMahto Спасибо, я обновлю его. – akrun

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 

melt и dcast с fun.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 
Смежные вопросы