2017-01-12 48 views
4

我試圖將表()函數應用到R中的矩陣。我想知道多長時間一次值(0 ,1)每欄出現。 如果列包含1和0,則沒有問題。但是,如果列只包含1或僅包含0,那麼apply()將返回一個奇怪的列表而不是矩陣。apply()和table()當列只有一個值(100%)時返回奇怪的列表

我該如何申請返回像矩陣2中的例子1中的矩陣?

#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 

編輯: 基質可以包含的NA

+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

這裏是colSums一個基礎R溶液來計算值,並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