求和 NA 的空 set/set 而不是 0?
make sum of an empty set/set of NA's NA instead of 0?
sum function return如果应用于空集则为0。
如果应用于一组 NA 值,是否有一种简单的方法可以使其 return 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 但是 sum 似乎不接受这些。
你可以试试
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]
sum function return如果应用于空集则为0。 如果应用于一组 NA 值,是否有一种简单的方法可以使其 return 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 但是 sum 似乎不接受这些。
你可以试试
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]