NAs的聚合导致0而不是NA

时间:2017-07-24 21:46:53

标签: r dplyr

我试图在数据框中找到三个不同变量的总和,同时按另一个变量进行分组,但是有几个NA。 NA的总和被解释为零而不是NA。这是一个例子:

my_data <- data.frame(Month = c("1995-01-01", "1995-01-01", "1995-01-01",
                            "1995-02-01", "1995-02-01"),
                  Value_1 = c(1, NA, 2, NA, NA),
                  Value_2 = c(2, 2, 3, NA, 1),
                  Value_3 = c(NA, NA, NA, NA, NA))

#summing through dplyr
my_data %>%
  group_by(Month) %>%
  summarise_each(funs(sum(.,na.rm = TRUE)))

#summing through base R
my_vars = c("Value_1", "Value_2", "Value_3")
aggregate(x = my_data[my_vars], by = my_data["Month"], FUN = sum, 
na.rm = TRUE) 

例如,对于两个月的Value_3,我得到的是总和为零而不是NA。任何关于如何将NA总和以获得NA而不是零的建议将不胜感激。

3 个答案:

答案 0 :(得分:4)

如果变量中的所有值都是NA,则可以添加if / else以返回NA:

select id, count(*) 
  from sub_rects r 
  join gps_points g on st_dwithin(r.geom, p.geom, 0)

答案 1 :(得分:2)

根据您自己的方法,添加ifelse

my_data %>%
    group_by(Month) %>%
    summarise_each(funs(ifelse(sum(is.na(.))==length(.),NA,sum(.,na.rm = TRUE))))

答案 2 :(得分:1)

我们也可以使用

来做到这一点
library(data.table)
setDT(my_data)[, lapply(.SD, function(x)  sum(x, na.rm = TRUE) *NA^(all(is.na(x)))), Month]
#       Month Value_1 Value_2 Value_3
#1: 1995-01-01       3       7      NA
#2: 1995-02-01      NA       1      NA