在R中按NA汇总

时间:2015-08-25 21:10:21

标签: r aggregate na

是否有人知道如何在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

由于

4 个答案:

答案 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])