【问题标题】:group_by and summaries with variable number of variablesgroup_by 和变量数量可变的摘要
【发布时间】:2022-06-10 18:38:23
【问题描述】:

使用{{var}} 表示法,以下代码可以工作。
用于分组和汇总 van 的变量作为参数提供给my_summary

我想修改my_summary,以便我可以为分组和汇总提供不同数量的变量。这个可以吗?

suppressPackageStartupMessages({
  library(tidyverse)
})

set.seed(4321)
demo_df <- 
  tibble(age=as.integer(rep(c(10,20),each=10)),
         gender=rep(c("f","m"),10),
         weight=rnorm(20,70,7),
         size=rnorm(20,160,15))

my_summary <- function(df_in,group_var,summary_var){
  df_in |>
    group_by({{group_var}}) |>
    summarise_at(vars({{summary_var}}),mean)
}


my_summary(demo_df,gender,weight)



【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    另一种可能的解决方案,允许多个分组变量:

    library(tidyverse)
    
    my_summary <- function(df_in, group_var,summary_var){
      
      df_in %>% 
        group_by(!!!group_var)  %>% 
        summarise(across({{summary_var}}, mean), .groups = "drop")
    }
    
    my_summary(demo_df, vars(age,gender), c(weight,size))
    
    #> # A tibble: 4 × 4
    #>     age gender weight  size
    #>   <int> <chr>   <dbl> <dbl>
    #> 1    10 f        71.5  159.
    #> 2    10 m        72.4  158.
    #> 3    20 f        64.3  167.
    #> 4    20 m        71.6  164.
    

    或者,没有vars(可能被取代):

    library(tidyverse)
    
    my_summary <- function(df_in, summary_var , ...){
      summary_var <- enquos(summary_var)
      group_var <- enquos(...)
      
      df_in %>% 
        group_by(!!!group_var)  %>% 
        summarise(across(!!!summary_var,mean), .groups = "drop")
    }
    
    my_summary(demo_df, c(weight, size), age, gender)
    
    #> # A tibble: 4 × 4
    #>     age gender weight  size
    #>   <int> <chr>   <dbl> <dbl>
    #> 1    10 f        71.5  159.
    #> 2    10 m        72.4  158.
    #> 3    20 f        64.3  167.
    #> 4    20 m        71.6  164.
    

    【讨论】:

      【解决方案2】:

      使用summarise(across(.))

      suppressPackageStartupMessages({
        library(tidyverse)
      })
      
      set.seed(4321)
      demo_df <- 
        tibble(age=as.integer(rep(c(10,20),each=10)),
               gender=rep(c("f","m"),10),
               weight=rnorm(20,70,7),
               size=rnorm(20,160,15))
      
      my_summary <- function(df_in,group_var,summary_var){
        df_in |>
          group_by({{group_var}}) |>
          summarise(across({{summary_var}}, mean))
      }
      
      
      my_summary(demo_df, gender, weight:size)
      #> # A tibble: 2 × 3
      #>   gender weight  size
      #>   <chr>   <dbl> <dbl>
      #> 1 f        67.9  163.
      #> 2 m        72.0  161.
      

      reprex package (v2.0.1) 于 2022-06-09 创建

      【讨论】:

      • 谢谢,这解决了我的问题。 across 也适用于 group_by
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-23
      • 2016-12-03
      • 2019-12-20
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多