簡體   English   中英

group_by 和變量數量可變的摘要

[英]group_by and summaries with variable number of variables

使用{{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)



另一種可能的解決方案,允許多個分組變量:

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.

使用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 包(v2.0.1) 創建於 2022-06-09

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM