代码之家  ›  专栏  ›  技术社区  ›  slhck

向dplyr函数内的vars()添加列名

  •  2
  • slhck  · 技术社区  · 7 年前

    dplyr :

    library(tidyverse)
    
    get_var_summary <- function(.data, .target_var, .group_vars = vars()) {
      .target_var = enquo(.target_var)
      return(
        .data %>%
          filter(!is.na(!! .target_var)) %>% 
          group_by_at(.vars = .group_vars) %>% 
          summarize(
            mean = mean(!! .target_var),
            sd = sd(!! .target_var),
            ci = qnorm(0.975) * sd(!! .target_var) / sqrt(n()),
            median = median(!! .target_var),
            n = n()
          ) %>% 
          mutate(
            sd = ifelse(is.na(sd), Inf, sd),
            ci = ifelse(is.na(ci), Inf, ci)
          ) %>% 
          ungroup()
      )
    }
    
    mtcars %>% 
      get_var_summary(wt, .group_vars = vars(cyl))
    

    退货:

    # A tibble: 3 x 6
        cyl  mean    sd    ci median     n
      <dbl> <dbl> <dbl> <dbl>  <dbl> <int>
    1    4.  2.29 0.570 0.337   2.20    11
    2    6.  3.12 0.356 0.264   3.22     7
    3    8.  4.00 0.759 0.398   3.76    14
    

    现在,为了能够轻松地重复 .group_vars get_var_summary

    get_var_summary_by_another <- function(.data, .extra_var, .target_var, .group_vars = vars()) {
    
      # how do I add .extra_var to .group_vars?
    
    }
    

    1 回复  |  直到 7 年前
        1
  •  2
  •   slhck    7 年前

    我们的想法是先把 .group_vars 具有 !!! .extra_var vars() 电话:

    get_var_summary_by_another <- function(.data, .extra_var, .target_var, .group_vars = vars()) {
      .extra_var = enquo(.extra_var)
      .target_var = enquo(.target_var)
      .group_vars = vars(!!! .group_vars, !! .extra_var)
      return(
        .data %>% get_var_summary(
          !! .target_var,
          .group_vars
        )
      )
    }
    
    mtcars %>% 
    get_var_summary_by_another(gear, .target_var = wt, .group_vars = vars(cyl))
    

    退货:

    # A tibble: 8 x 7
        cyl  gear  mean      sd      ci median     n
      <dbl> <dbl> <dbl>   <dbl>   <dbl>  <dbl> <int>
    1    4.    3.  2.46 Inf     Inf       2.46     1
    2    4.    4.  2.38   0.601   0.416   2.26     8
    3    4.    5.  1.83   0.443   0.614   1.83     2
    4    6.    3.  3.34   0.173   0.240   3.34     2
    5    6.    4.  3.09   0.413   0.405   3.16     4
    6    6.    5.  2.77 Inf     Inf       2.77     1
    7    8.    3.  4.10   0.768   0.435   3.81    12
    8    8.    5.  3.37   0.283   0.392   3.37     2