2017-01-12 7 views
4

Я пытаюсь применить функцию table() к матрице в R. Я хочу знать, как часто значение (0 , 1) появляется в столбце. Нет проблем, если столбец содержит как 1, так и 0. Но если столбец содержит только 1 или только 0, тогда apply() возвращает странный список вместо матрицы.apply() и table() возвращают странный список, когда столбец имеет только одно значение (100%)

Как я могу применить для возврата матрицы, как в примере 1 для матрицы 2?

#example 1 
good_mat<-matrix(c(c(1,0,1),c(1,0,1),c(0,0,1)), 3,3, byrow=F) 
apply(good_mat, 2, FUN=table) # good result, matrix 

#example 2 
bad_mat<-matrix(c(rep(1,3),c(1,NA,1),c(0,0,1)), 3,3, byrow=F) 
apply(bad_mat, 2, FUN=table) # strange list 

редактирования: матрица может содержать NAs

+2

Я не отношусь к одному значению со 100%. Это связано с тем, что три рассчитанные таблицы не имеют одинаковых значений. – Axeman

+0

вам нужно использовать 'apply' ?? – Sotos

+1

'apply (bad_mat + 1, 2, tabulate)' – Axeman

ответ

3

Я бы рекомендовал пакет matrixStats,

library(matrixStats) 
rbind(colCounts(good_mat, value = 0, na.rm = TRUE), 
     colCounts(good_mat, value = 1, na.rm = TRUE)) 

#  [,1] [,2] [,3] 
#[1,] 0 1 3 
#[2,] 3 2 0 
+1

Прекрасно работает с ..., na.rm = T) – enroute

2

Базовый раствор:

m <- matrix(c(c(1,1,1),c(1,0,1),c(0,0,0)), 3,3, byrow=F) 

rbind(nrow(m) - rowSums(m, na.rm = TRUE), rowSums(m, na.rm = TRUE)) 
 [,1] [,2] [,3] 
[1,] 0 1 3 
[2,] 3 2 0 

Или

tmp <- colSums(m, na.rm = TRUE) 
rbind(nrow(m) - tmp, tmp) 
1

Здесь основание R решение с colSums для вычисления значений и rbind объединить результаты.

rbind((colSums(bad_mat == 0)), (colSums(bad_mat == 1))) 
    [,1] [,2] [,3] 
[1,] 0 1 2 
[2,] 3 2 1 

или обобщать на более чем двоичных значений, можно обернуть это в lapply и кормить его do.call. Просто замените 0:1 на требуемые значения.

do.call(rbind, lapply(0:1, function(i) colSums(bad_mat == i))) 
    [,1] [,2] [,3] 
[1,] 0 1 2 
[2,] 3 2 1