0

我在 R 中工作,我有一个带有A,BNA值的矩阵,我想计算每列中ABNA值的数量并将结果插入表中。我使用下面的代码来计算A,BNA.

mydata <- matrix(c(rep("A", 8), rep("B", 2), rep(NA, 2), rep("A", 4),
rep(c("B", "A", "A", "A"), 2), rep("A", 4)), ncol = 4, byrow = TRUE)

myFun <- function(x) {
data.frame(n.A = sum(x == "A", na.rm = TRUE), n.B = sum(x == "B",
na.rm = TRUE), n.NA = sum(is.na(x)))
}

count <- apply(mydata, 2, myFun)

现在,我需要将 count 的结果(count <- apply(mydata, 2, myFun))作为只有标题的表插入到数据框中。

4

2 回答 2

2

在概念上与 mnel 的答案几乎相同,您也可以在 base R 中尝试以下操作:

sapply(as.data.frame(mydata), 
       function(x) table(factor(x, levels = unique(as.vector(mydata))), 
                         useNA = "always"))
#      V1 V2 V3 V4
# A     4  6  6  6
# B     3  1  0  0
# <NA>  0  0  1  1

在这里,我没有手动指定因子水平,而是使用了mydata.

于 2013-04-17T04:46:25.457 回答
0

我认为使用plyrand adplyor最简单ldply

您可以替换myfun为调用表。

library(plyr)
adply(mydata,2, function(x) table(factor(x, levels = c('A','B')), useNA = 'always'))
#   X1 A B NA
# 1  1 4 3  0
# 2  2 6 1  0
# 3  3 6 0  1
# 4  4 6 0  1

如果你有大数据,那plyr不是办法。apply会很好地工作

apply(mydata, 2, function(x) {
          xx <- table(factor(x, levels = c('A','B')), useNA = 'always')
          names(xx) <- c('nA','nB', 'nNA')
          xx}) 


   [,1] [,2] [,3] [,4]
nA     4    6    6    6
nB     3    1    0    0
nNA    0    0    1    1
于 2013-04-17T04:11:52.323 回答