【问题标题】:How do you calculate row and column totals on a tibble using tidyverse functions [duplicate]如何使用 tidyverse 函数计算 tibble 上的行和列总计 [重复]
【发布时间】:2020-06-09 10:28:54
【问题描述】:

给定一个 n x m tibble 和数值。如何计算 tibble 的行和列总计。

这是一个带有示例 tibble 的代表:

library(tidyverse)
df <- tibble(names=c('a','b','c','d','e'),x = 1:5, y =5:1, z=2:6)
df
#> # A tibble: 5 x 4
#>   names     x     y     z
#>   <chr> <int> <int> <int>
#> 1 a         1     5     2
#> 2 b         2     4     3
#> 3 c         3     3     4
#> 4 d         4     2     5
#> 5 e         5     1     6

reprex package (v0.3.0) 于 2020 年 6 月 9 日创建

鉴于此 tibble,我想有效地使用 tidyverse 函数来实现以下输出:

我已经能够通过聚集、传播和连接的组合来实现这一点,但我对 R 和 tidyverse 还很陌生,想看看是否有更有效的方法来实现这一点。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    janitor 库有 adorn_totals 函数:

    library(janitor)
    df %>%
      adorn_totals(name = 'col_sum') %>%
      adorn_totals(name = 'row_sum', where = 'col')
    
    
    #   names  x  y  z row_sum
    #       a  1  5  2       8
    #       b  2  4  3       9
    #       c  3  3  4      10
    #       d  4  2  5      11
    #       e  5  1  6      12
    # col_sum 15 15 20      50
    

    【讨论】:

      【解决方案2】:

      bind_rowsbind_cols 的解决方案:

      library(tidyverse)
      df %>% 
        bind_cols(
          df %>% rowwise() %>% summarise(row_sum = sum(c_across(is.numeric)))
        ) %>% 
        bind_rows(
          df %>% summarise(across(is.numeric, sum))
        ) %>% 
        mutate(names = if_else(is.na(names), "col_sum", names))
      
      # A tibble: 6 x 5
        names       x     y     z row_sum
        <chr>   <int> <int> <int>   <int>
      1 a           1     5     2       8
      2 b           2     4     3       9
      3 c           3     3     4      10
      4 d           4     2     5      11
      5 e           5     1     6      12
      6 col_sum    15    15    20      NA
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-11
        • 1970-01-01
        • 1970-01-01
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多