在dplyr :: group_by中使用tidyeval的括号

时间:2019-11-25 20:28:10

标签: dplyr lazy-evaluation tidyeval

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

library(tidyverse)
library(magrittr)

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

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

但这会返回按字符串而不是变量名分组的对象。

这有效

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

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

但是我希望能找到一种更惯用的方法。

1 个答案:

答案 0 :(得分:2)

改为使用!!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创建