是否有人知道如何在R中按NA汇总。
如果您采用以下示例
a <- matrix(1,5,2)
a[1:2,2] <- NA
a[3:5,2] <- 2
aggregate(a[,1], by=list(a[,2]), sum)
输出结果为:
Group.1 x
2 3
但有没有办法让输出在输出中包含NA,如下所示:
Group.1 x
2 3
NA 2
由于
答案 0 :(得分:8)
您可能需要考虑aggregate()
,而不是rowsum()
。它实际上是为矩阵上的这种精确操作而设计的,并且比aggregate()
快得多。我们可以将NA
添加到a[, 2]
的因子级别addNA()
。这将确保NA
显示为分组变量。
rowsum(a[, 1], addNA(a[, 2]))
# [,1]
# 2 3
# <NA> 2
如果您仍想使用aggregate()
,也可以合并addNA()
。
aggregate(a[, 1], list(Group = addNA(a[, 2])), sum)
# Group x
# 1 2 3
# 2 <NA> 2
data.table -
还有一个选项library(data.table)
as.data.table(a)[, .(x = sum(V1)), by = .(Group = V2)]
# Group x
# 1: NA 2
# 2: 2 3
答案 1 :(得分:3)
使用dplyr摘要
library(dplyr)
a %>%
as.data.frame %>%
group_by(V2) %>%
summarize(V1_sum = sum(V1))
答案 2 :(得分:3)
使用
>>> not None == True True
:
sqldf
输出:
a <- as.data.frame(a)
sqldf("SELECT V2 [Group], SUM(V1) x
FROM a
GROUP BY V2")
统计资料包
AdamO提案的变体:
Group x
1 NA 2
2 2 3
输出:
data.frame(xtabs( V1 ~ V2 , data = a,na.action = na.pass, exclude = NULL))
答案 3 :(得分:0)
Rich的addNA
解决方案并不需要对aggregate
语法进行任何实质性更改,因此我认为这是最佳解决方案。我指出另一个产生类似于table
的输出(因此可以被强制转换为类似于data.frame
的{{1}}结构)的选项是{{1} }。
aggregate
给出:
xtabs
另一个&#34;技巧&#34;我看到为这些数据分配了丢失的代码。我们都喜欢R的xtabs(a[, 1] ~ a[, 2], addNA=T)
输出,但是为分组变量分配丢失的代码是一个很好的编码练习。我们认为它比数据集中的最大值多一个数字,其形式为-999 ... 99。
Group.1 x
1 2 3
2 <NA> 2
一般工作。
然后你得到
NA
和
codemiss <- function(x) -10^(floor(log(max(abs(x), na.rm=T), base=10))+2)-1
给你:
a[, 2][is.na(a[, 2])] <- codemiss(a[, 2])