【问题标题】:How to calculate the sum of all columns based on a grouped variable and remove NA如何根据分组变量计算所有列的总和并删除 NA
【发布时间】:2021-12-11 07:10:39
【问题描述】:

我有一个数据集,我想按 ID 变量分组,然后计算每个列/变量的总和。但是,如您所见,我有一些 NA ,我想在 sum 函数被执行时删除它们,因为它们在某些行中返回 NA 尽管相同 ID 的某些行包含值。我试图环顾四周,但没有成功,我再次尝试了不同的方法,但没有成功。我将不胜感激。

提前谢谢你。

data <- data.frame(ID = c(1, 1, 2, 2, 3, 3, 3, 4, 4, 4),
              var1 = c(1, 2, 5, 10, NA, 5, 23, NA, NA, 1),
              var2 = c(1, NA, NA, 1, NA, 0, 1, 3, 23, 4))


data <- data %>%
group_by(ID) %>%
summarise(across(everything(), sum(., na.rm = T)))

【问题讨论】:

    标签: r dplyr group-by sum


    【解决方案1】:

    只是波浪号 ~ 不见了:

    data %>%
      group_by(ID) %>%
      summarise(across(everything(), ~sum(., na.rm = T)))
    # A tibble: 4 x 3
         ID  var1  var2
    * <dbl> <dbl> <dbl>
    1     1     3     1
    2     2    15     1
    3     3    28     1
    4     4     1    30
    

    如果一个ID 组只有NA 值,您可以这样做:

    data %>%
      group_by(ID) %>%
      summarise(across(everything(), ~ifelse(all(is.na(.)), NA, sum(., na.rm = T))))
    

    【讨论】:

    • 但是,如果一个 ID 组在我的数据中只有 NA,则此代码给我 0 而不是 NA。我将如何编码,以便当至少有一个值时,它会返回该值而忽略 NA,但是当只有 NA 时,它会在该单元格中重新调整 NA?谢谢
    • 已编辑我的答案。现在可以用了吗?
    • 嗨,是的。这太有帮助了。再次非常感谢您。
    【解决方案2】:

    我们可以在不使用 lambda 函数的情况下指定函数的参数

    library(dplyr)
    data %>%
         group_by(ID) %>%
         summarise(across(everything(), sum, na.rm = TRUE), .groups = 'drop')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 2021-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 1970-01-01
      • 2020-11-29
      相关资源
      最近更新 更多