与`dplyr :: count()`的标准评估

时间:2019-03-19 19:06:22

标签: r dplyr standard-evaluation

如何将字符向量传递给dplyr::count()

library(magrittr)
variables <- c("cyl", "vs")

mtcars %>% 
  dplyr::count_(variables)

这很好,但是dplyr v0.8发出警告:

  

count_()已过时。      请改为使用count()

     

“编程”小插图或tidyeval书可以帮助您      用count()编程:https://tidyeval.tidyverse.org

我没有在https://tidyeval.tidyverse.org/dplyr.htmltidyeval book的当前版本的Programming with dplyr或其他章节中看到引号或dplyr::count()的标准评估示例。

阅读完本文档后,我的两个最佳猜测是another SO question

mtcars %>% 
  dplyr::count(!!variables)

mtcars %>% 
  dplyr::count(!!rlang::sym(variables))

会抛出这两个错误:

  

错误:列<chr>的长度必须为32(行数)或一个,   不是2

     

错误:只能将字符串转换为符号

2 个答案:

答案 0 :(得分:3)

要从字符串创建符号列表,您需要rlang::syms(而不是rlang::sym)。要取消引用列表或向量,请使用!!!(而不是!!)。以下将起作用:

library(magrittr)

variables <- c("cyl", "vs")

vars_sym <- rlang::syms(variables)
vars_sym
#> [[1]]
#> cyl
#> 
#> [[2]]
#> vs

mtcars %>%
  dplyr::count(!!! vars_sym)
#> # A tibble: 5 x 3
#>     cyl    vs     n
#>   <dbl> <dbl> <int>
#> 1     4     0     1
#> 2     4     1    10
#> 3     6     0     3
#> 4     6     1     4
#> 5     8     0    14

答案 1 :(得分:0)

也许您可以尝试

mtcars %>%
  group_by(cyl, vs) %>%
  tally()

这给

# A tibble: 5 x 3
# Groups:   cyl [3]
    cyl    vs     n
  <dbl> <dbl> <int>
1     4     0     1
2     4     1    10
3     6     0     3
4     6     1     4
5     8     0    14