【问题标题】:Sum of specific columns using mutate and sum with NA values使用 mutate 和 sum with NA 值的特定列的总和
【发布时间】:2022-01-15 06:43:36
【问题描述】:

我有以下数据框Data

a b c
1 1 2
2 NA 4
NA 3 NA
NA NA NA

我想使用dplyrs mutate 函数和sum 计算列 a 到 c 的总和以获得以下结果:

a b c d
1 1 2 5
2 NA 4 6
NA 3 NA 3
NA NA NA NA

重要的是 NA 基本上被视为 0,除非它们都是 NA,然后它会将总和返回为 NA。

我想我可以做到:

Data<-Data %>%
mutate(d=sum(a,b,c,na.rm=TRUE))

问题是我不想列出所有变量abc,而是想利用: 功能,以便我可以列出像这样a:c 的变量。

我想写这样的代码:

Data<-Data %>%
mutate(d=sum(a:c,na.rm=TRUE))

但这不起作用。我不知道我是否应该在 a 和 c 周围加上引号?

我发誓我之前已经完成了这一百万次,但是我找不到以前使用过的代码,并且由于某种原因我今天的大脑冻结了。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    保持简单:

     df %>% 
        mutate(
            d = rowSums(across(everything()), na.rm =T),
            d = na_if(d, 0)
        )
    # A tibble: 4 x 4
          a     b     c     d
      <int> <int> <int> <dbl>
    1     1     1     2     4
    2     2    NA     4     6
    3    NA     3    NA     3
    4    NA    NA    NA    NA
    

    【讨论】:

    • 澄清一下,您也可以在across() 中使用:,因此对于OP 更准确的解决方案是d = rowSums(across(a:c), na.rm =T)
    • 我的意思是,你可以在内部使用任何 tidyselect 动词。我只是觉得 tidyselect 的范围在这里有点跑题了。
    【解决方案2】:

    您可以更改任何 tidyverse 选择器的所有内容,例如 match 或 starts_with

    library(tidyverse)
    
    df_example <- tibble::tribble(
      ~a, ~b, ~c,
      1L, 1L, 2L,
      2L, NA, 4L,
      NA, 3L, NA,
      NA, NA, NA
      )
    
    df_example |> 
      rowwise() |> 
      mutate(d = c_across(everything()) |> sum(na.rm = TRUE)) |> 
      ungroup()
    #> # A tibble: 4 x 4
    #>       a     b     c     d
    #>   <int> <int> <int> <int>
    #> 1     1     1     2     4
    #> 2     2    NA     4     6
    #> 3    NA     3    NA     3
    #> 4    NA    NA    NA     0
    

    reprex package (v2.0.1) 于 2021 年 12 月 10 日创建

    一个不太通用的解决方案是使用 rowwise 函数,如 rowSums

    library(tidyverse)
    
    df_example <- tibble::tribble(
      ~a, ~b, ~c,
      1L, 1L, 2L,
      2L, NA, 4L,
      NA, 3L, NA,
      NA, NA, NA
      )
    
    df_example |> 
      mutate(d = across(everything()) |> rowSums(na.rm = TRUE))
    #> # A tibble: 4 x 4
    #>       a     b     c     d
    #>   <int> <int> <int> <dbl>
    #> 1     1     1     2     4
    #> 2     2    NA     4     6
    #> 3    NA     3    NA     3
    #> 4    NA    NA    NA     0
    

    reprex package (v2.0.1) 于 2021-12-10 创建

    【讨论】:

      【解决方案3】:

      像这样:

      df  %>%
        rowwise() %>%
        mutate(d=sum(across(a:c),na.rm=TRUE)) %>%
        ungroup()
      

      rowSums 也是一个选项

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多