【问题标题】:Mutate dynamically created variable dplyr改变动态创建的变量 dplyr
【发布时间】:2021-07-30 16:15:49
【问题描述】:

我正在尝试创建一个函数,其中我使用多个函数汇总数据框中的几列,然后稍后改变这些函数的输出。

下面给出一个更简单的例子:

group_mean_plus_one <- function(df, groups, var){
  
  df %>% 
    group_by(across({{groups}})) %>%
    
    summarise(across({{ var }}, 
                     .fns = list(mean = ~mean(.x, na.rm=TRUE),
                                 sd = ~sd(.x, na.rm=TRUE)),
                     .names = "{.col}_{.fn}")) %>%
    
    mutate("mean_plus_one_{{var}}" := !!rlang::expr("{{var}}_mean + 1"))
  
}

tibble(mtcars) %>%
  group_mean_plus_one(groups = cyl, var = hp)

这里的想法是我们按group 中的每个变量分组,并使用给定的函数汇总var 中的每个变量。

进一步,我们希望引用在summarise 块中创建的变量和来自这些的mutate 新变量。但是,我很难从 summarise 块中引用这些动态创建的变量名。

运行以上返回:

# A tibble: 3 x 4
    cyl hp_mean hp_sd mean_plus_one_hp
  <dbl>   <dbl> <dbl> <chr>           
1     4    82.6  20.9 {{var}}_mean + 1
2     6   122.   24.3 {{var}}_mean + 1
3     8   209.   51.0 {{var}}_mean + 1

当我希望它返回时:

# A tibble: 3 x 4
    cyl hp_mean hp_sd mean_plus_one_hp
  <dbl>   <dbl> <dbl>            <dbl>
1     4    82.6  20.9             83.6
2     6   122.   24.3            123. 
3     8   209.   51.0            210. 

非常感谢任何帮助,在此先感谢 :)

【问题讨论】:

    标签: r dplyr tidyeval


    【解决方案1】:

    我们可以转换成字符串,并使用.data

    group_mean_plus_one <- function(df, groups, var){
      
      var1 <- rlang::as_string(rlang::ensym(var))
      df %>% 
        group_by(across({{groups}})) %>%
        
        summarise(across({{ var }}, 
                         .fns = list(mean = ~mean(.x, na.rm=TRUE),
                                     sd = ~sd(.x, na.rm=TRUE)),
                         .names = "{.col}_{.fn}")) %>%
             mutate("mean_plus_one_{{var}}" :=  .data[[str_c(var1, "_mean")]] + 1)         
      
    }
    

    -测试

    tibble(mtcars) %>%
      group_mean_plus_one(groups = cyl, var = hp)
    # A tibble: 3 x 4
        cyl hp_mean hp_sd mean_plus_one_hp
      <dbl>   <dbl> <dbl>            <dbl>
    1     4    82.6  20.9             83.6
    2     6   122.   24.3            123. 
    3     8   209.   51.0            210. 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-03
      • 2018-05-06
      • 1970-01-01
      • 2019-12-10
      • 2021-10-26
      • 2011-10-27
      • 1970-01-01
      相关资源
      最近更新 更多