得到一组空NA/NA的NA而不是0?

Kas*_*any 5 r sum na

如果将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但总和似乎并不接受这些.

akr*_*run 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)
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)