首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用多个符号简化tidyeval

用多个符号简化tidyeval
EN

Stack Overflow用户
提问于 2022-01-17 21:06:25
回答 1查看 276关注 0票数 1

下面的函数按需要运行:可以将几个变量传递给group_by,而不需要将它们放入alist()dplyr::vars

代码语言:javascript
复制
mean_by_grp <- function(df, meanvar, grp) {
  
  grouping <- enexpr(grp) %>% 
    expr_deparse %>% 
    str_split(",",simplify = T) %>% `[`(1,) %>% 
    map(str_remove,"c\\(") %>% map(str_remove,"\\)") %>% map(str_trim) %>% 
    unlist %>% syms
  
  df %>% 
    group_by(!!!syms(grouping)) %>% 
    summarise("average_{{meanvar}}" := mean({{meanvar}}, na.rm = TRUE),
              .groups = 'drop')
}

starwars %>% mean_by_grp(height, species)
starwars %>% mean_by_grp(height, c(species, homeworld))

然而,它是复杂的。我需要将c(var1,....varn)转换为字符串,将其拆分,并将其转换为符号列表,以便与syms一起使用。

难道没有更简单的方法吗?

当然,我可以用椭圆代替grp,但是我只能有一个参数将多个符号传递给另一个函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-17 22:13:34

一种选择是dplyr::across

代码语言:javascript
复制
mean_by_grp <- function(df, meanvar, grp) {
  df %>% 
    group_by(across({{ grp }})) %>% 
    summarise("average_{{meanvar}}" := mean({{meanvar}}, na.rm = TRUE),
              .groups = 'drop')
}

library(dplyr)

starwars %>% mean_by_grp(height, species)
#> # A tibble: 38 × 2
#>    species   average_height
#>    <chr>              <dbl>
#>  1 Aleena               79 
#>  2 Besalisk            198 
#>  3 Cerean              198 
#>  4 Chagrian            196 
#>  5 Clawdite            168 
#>  6 Droid               131.
#>  7 Dug                 112 
#>  8 Ewok                 88 
#>  9 Geonosian           183 
#> 10 Gungan              209.
#> # … with 28 more rows
starwars %>% mean_by_grp(height, c(species, homeworld))
#> # A tibble: 58 × 3
#>    species  homeworld   average_height
#>    <chr>    <chr>                <dbl>
#>  1 Aleena   Aleen Minor             79
#>  2 Besalisk Ojom                   198
#>  3 Cerean   Cerea                  198
#>  4 Chagrian Champala               196
#>  5 Clawdite Zolan                  168
#>  6 Droid    Naboo                   96
#>  7 Droid    Tatooine               132
#>  8 Droid    <NA>                   148
#>  9 Dug      Malastare              112
#> 10 Ewok     Endor                   88
#> # … with 48 more rows
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70747508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档