【问题标题】:Aggregation of NAs results in 0s instead of NAsNAs 的聚合导致 0s 而不是 NAs
【发布时间】:2023-03-23 20:25:01
【问题描述】:

我试图在一个数据框中找到三个不同变量的总和,同时按另一个变量分组,但是有几个 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 而不是零的建议将不胜感激。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

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

    my_data %>% 
        group_by(Month) %>% 
        summarise_all(
            funs(if(all(is.na(.))) NA else sum(., na.rm = TRUE))
        )
    
    # A tibble: 2 x 4
    #       Month Value_1 Value_2 Value_3
    #      <fctr>   <dbl>   <dbl>   <lgl>
    #1 1995-01-01       3       7      NA
    #2 1995-02-01      NA       1      NA
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        我们也可以使用

        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
        

        【讨论】:

          猜你喜欢
          • 2010-11-30
          • 1970-01-01
          • 2016-01-07
          • 2015-10-31
          • 1970-01-01
          • 1970-01-01
          • 2020-11-06
          • 2016-06-21
          • 1970-01-01
          相关资源
          最近更新 更多