2013-04-17 42 views
0

我在R工作组和我有一个矩阵ABNA价值观,我想算ABNA值数在每一列中插入结果到表格中。我使用下面的代码来说明ABNA插入数列中的元素数到表中的R

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 <- apply(mydata, 2, myFun))结果放到一个数据帧作为一个表,只有一个头。

+2

你能发表预期产出的例子吗?你的意思是''do.call(rbind,count)'? – A5C1D2H2I1M1N2O1R2T1

回答

0

我认为最简单的使用plyradplyldply

您可以到表调用替换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 
+0

因此,在这种方法不起作用,因为我的数据集非常大,为600 x 600,000尺寸。因此,请在splitter_a(.data,.margins,.expand)中给出错误消息:无效保证金 – user2288980

+0

输出文件与上面给出的类似,但不适用于我的数据。我希望列的总数。 – user2288980

+0

总数不总是一样吗? – mnel

2

在概念上几乎完全相同MNEL的答案,你也可以尝试在基础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中的数据。