sum function如果应用于空集,则返回0。 如果它应用于一组NA值,是否有一种简单的方法可以使其返回NA?
以下是borrowed示例:
test <- data.frame(name = rep(c("A", "B", "C"), each = 4),
var1 = rep(c(1:3, NA), 3),
var2 = 1:12,
var3 = c(rep(NA, 4), 1:8))
test
name var1 var2 var3
1 A 1 1 NA
2 A 2 2 NA
3 A 3 3 NA
4 A NA 4 NA
5 B 1 5 1
6 B 2 6 2
7 B 3 7 3
8 B NA 8 4
9 C 1 9 5
10 C 2 10 6
11 C 3 11 7
12 C NA 12 8
我希望每个名字都有三个变量的总和。这是我试过的:
var_to_aggr <- c("var1","var2","var3")
aggr_by <- "name"
summed <- aggregate(test[var_to_aggr],by=test[aggr_by],FUN="sum", na.rm = TRUE)
这给了我:
name var1 var2 var3
1 A 6 10 0
2 B 6 26 10
3 C 6 42 26
但我需要:
name var1 var2 var3
1 A 6 10 NA
2 B 6 26 10
3 C 6 42 26
名称A,var3的总和应为NA而不是0。 (只是要清楚,对于名称A,var1,它不应该是NA,其中集合包含一个NA,但也包含应该总结的有效值)。有什么想法吗?
我一直在摆弄na.action,但总和似乎并不接受这些。
答案 0 :(得分:6)
你可以尝试
f1 <- function(x) if(all(is.na(x))) NA_integer_ else sum(x, na.rm=TRUE)
aggregate(.~name, test, FUN=f1, na.action=NULL)
或者
library(dplyr)
test %>%
group_by(name) %>%
summarise_each(funs(f1))
或者
library(data.table)
setDT(test)[, lapply(.SD, f1), name]