总计/总和和N / A值

时间:2019-01-14 09:54:51

标签: r

我对汇总或N / A处理总和的方式有疑问。

我想要下表中每个区域的代码

test <- read.table(text = "
area.code   A    B   C   D
1          0  NA 0.00  NA  NA
2          1 0.0 3.10 9.6 0.0
3          1 0.0 3.20 6.0 0.0
4          2 0.0 6.10 5.0 0.0
5          2 0.0 6.50 8.0 0.0
6          2 0.0 6.90 4.0 3.1
7          3 0.0 6.70 3.0 3.2
8          3 0.0 6.80 3.1 6.1
9          3 0.0 0.35 3.2 6.5
10         3 0.0 0.67 6.1 6.9
11         4 0.0 0.25 6.5 6.7
12         5 0.0 0.68 6.9 6.8
13         6 0.0 0.95 6.7 0.0
14         7 1.2   NA 6.8 0.0
")

所以,看起来很简单:

aggregate(.~area.code, test, sum)



area.code A     B    C    D
1         1 0  6.30 15.6  0.0
2         2 0 19.50 17.0  3.1
3         3 0 14.52 15.4 22.7
4         4 0  0.25  6.5  6.7
5         5 0  0.68  6.9  6.8
6         6 0  0.95  6.7  0.0

显然不是那么简单,因为区域代码7从聚合()命令中完全省略了。

但是我希望N / A被完全忽略或计算为零值,哪一个na =命令可以提供该选项?

如果我只想要总和,则将所有N / A替换为0是一个选择...但是平均值确实很成问题(因为它再也无法在0和N / A之间进行区分了)

3 个答案:

答案 0 :(得分:1)

一个选择是创建一个函数,当所有值均为NA或使用NA时给出sum。除此之外,请在na.action中使用aggregate参数,因为如果存在至少一个NA,aggregate可以删除该行

f1 <- function(x) if(all(is.na(x))) NA else sum(x, na.rm = TRUE)
aggregate(.~area.code, test, f1, na.action = na.pass)
# area.code   A     B    C    D
#1         0  NA  0.00   NA   NA
#2         1 0.0  6.30 15.6  0.0
#3         2 0.0 19.50 17.0  3.1
#4         3 0.0 14.52 15.4 22.7
#         4 0.0  0.25  6.5  6.7
#6         5 0.0  0.68  6.9  6.8
#7         6 0.0  0.95  6.7  0.0
#8         7 1.2    NA  6.8  0.0

当只有NA个元素并且我们将sumna.rm = TRUE一起使用时,它将返回0

sum(c(NA, NA), na.rm = TRUE)
#[1] 0

答案 1 :(得分:1)

如果您愿意考虑使用外部软件包(data.table

setDT(test)
test[, lapply(.SD, sum), area.code]
   area.code   A     B    C    D
1:         0  NA  0.00   NA   NA
2:         1 0.0  6.30 15.6  0.0
3:         2 0.0 19.50 17.0  3.1
4:         3 0.0 14.52 15.4 22.7
5:         4 0.0  0.25  6.5  6.7
6:         5 0.0  0.68  6.9  6.8
7:         6 0.0  0.95  6.7  0.0
8:         7 1.2    NA  6.8  0.0

答案 2 :(得分:0)

另一种解决方案是使用dplyr

test %>%
  group_by(area.code) %>%
  summarise_all(sum, na.rm = TRUE)