如果将sum函数应用于空集,则sum函数返回0.如果它应用于一组NA值,是否有一种简单的方法可以使其返回NA?
这是一个借来的例子:
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
Run Code Online (Sandbox Code Playgroud)
我希望每个名字都有三个变量的总和.这是我尝试过的:
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)
Run Code Online (Sandbox Code Playgroud)
这给了我:
name var1 var2 var3
1 A 6 10 0
2 B 6 26 10
3 C 6 42 26
Run Code Online (Sandbox Code Playgroud)
但是我需要:
name var1 var2 var3
1 A 6 10 NA
2 B 6 26 10
3 C 6 42 26
Run Code Online (Sandbox Code Playgroud)
名称A,var3的总和应该是NA而不是0.(只是要清楚,对于名称A,var1,它不应该是NA,其中集合包含一个NA,但也包含应该总结的有效值).有任何想法吗?
我一直在摆弄na.action但总和似乎并不接受这些.
你可以试试
f1 <- function(x) if(all(is.na(x))) NA_integer_ else sum(x, na.rm=TRUE)
aggregate(.~name, test, FUN=f1, na.action=NULL)
Run Code Online (Sandbox Code Playgroud)
要么
library(dplyr)
test %>%
group_by(name) %>%
summarise_each(funs(f1))
Run Code Online (Sandbox Code Playgroud)
要么
library(data.table)
setDT(test)[, lapply(.SD, f1), name]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
813 次 |
| 最近记录: |