我对汇总或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之间进行区分了)
答案 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
个元素并且我们将sum
与na.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)