当列只有一个值(100%)时,apply()和table()返回奇怪的列表

时间:2017-01-12 14:17:02

标签: r matrix apply

我正在尝试将table()函数应用于R中的矩阵。我想知道每列出现值(0,1)的频率。 如果列包含1和0,则没有问题。但是如果列仅包含1或仅包含0,则apply()将返回奇怪的列表而不是矩阵。

如何申请返回矩阵2中的矩阵,如示例1所示?

cURL error 35: SSL: CA certificate set, but certificate verification is disabled

编辑: 矩阵可以包含NA

3 个答案:

答案 0 :(得分: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 :(得分: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)

答案 2 :(得分: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