使用带 dplyr::group_by 的 tidyeval 大括号

Using tidyeval's braces with a dplyr::group_by

我想将字符串向量传递给 purrr::map 以生成表格列表。

library(tidyverse)
library(magrittr)

names(mtcars) %>% 
  extract(8:10) %>% 
  map(
   function(i)

     mtcars %>% 
     group_by({{i}}) %>% 
     tally
   )

但是这个 returns 对象按字符串分组,而不是变量名。

这个有效

names(mtcars) %>% 
  extract(8:10) %>% 
  map(
    function(i)

      mtcars %>% 
      group_by(get(i)) %>% 
      tally
    )

但我希望有一个更简洁的解决方案。

改用!!sym(i)。我不完全理解为什么会这样,但我想你需要先从你的字符串中创建一个符号,然后必须对它进行准引用,以便能够用函数中的占位符替换它。如果这是有道理的。


library(tidyverse)

names(mtcars)[8:10] %>% 
  map(
    function(i)

      mtcars %>% 
      group_by(!!sym(i)) %>% 
      tally
  )
#> [[1]]
#> # A tibble: 2 x 2
#>      vs     n
#>   <dbl> <int>
#> 1     0    18
#> 2     1    14
#> 
#> [[2]]
#> # A tibble: 2 x 2
#>      am     n
#>   <dbl> <int>
#> 1     0    19
#> 2     1    13
#> 
#> [[3]]
#> # A tibble: 3 x 2
#>    gear     n
#>   <dbl> <int>
#> 1     3    15
#> 2     4    12
#> 3     5     5

reprex package (v0.2.1)

于 2019-11-25 创建