我在R工作,我有一个包含A
,B
和NA
值的矩阵,我想计算A
的数量或每列中的B
或NA
值,并将结果插入表中。我使用下面的代码来说明A
,B
和NA
。
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))
的结果作为仅包含标题的表插入到数据框中。
答案 0 :(得分: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
中的数据。
答案 1 :(得分:0)
我认为最简单的使用plyr
和adply
或ldply
您可以通过调用table替换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