【问题标题】:Using tidyeval's braces with a dplyr::group_by将 tidyeval 的大括号与 dplyr::group_by 一起使用
【发布时间】:2019-11-25 20:28:10
【问题描述】:

我想将字符串向量传递给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
    )

但我希望有一个更符合习惯用法的解决方案。

【问题讨论】:

  • 在你的第一个函数中删除 extract(8:10) %>% 对我有用
  • @Tung --不,这只是为大量对象复制了故障。对这个字符串向量进行子集化并没有什么不同。

标签: dplyr lazy-evaluation tidyeval


【解决方案1】:

请改用!!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 日创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 2019-11-29
    • 2016-10-17
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多