带有`dplyr::count()`的标准评估[重复]

Posted

技术标签:

【中文标题】带有`dplyr::count()`的标准评估[重复]【英文标题】:standard eval with `dplyr::count()` [duplicate] 【发布时间】:2019-03-19 19:06:21 【问题描述】:

如何将字符向量传递给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))

抛出这两个错误:

错误:列 &lt;chr&gt; 的长度必须为 32(行数)或 1, 不是 2

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

【问题讨论】:

改为!!!rlang::syms(variables) 【参考方案1】:

要从字符串创建符号列表,您需要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

【讨论】:

您可能会澄清术语“取消引用”,特别是指将字符向量转换为 R“符号”,因为术语引用可能被解释为函数 quote 的使用,例如然后可以使用as.character 完成哪种形式的“反转”,然后提供不同类型的“引用”值。【参考方案2】:

也许你可以试试

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

【讨论】:

OP 正在尝试以编程方式执行此操作,例如使用 tidyeval,而不是通过在 group_by 中提供特定列名

以上是关于带有`dplyr::count()`的标准评估[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 Java 代码的 WEKA 评估类来显示标准差值

dplyr,使用带有非标准评估的过滤器

使用带有标准输入和标准输出重定向的 2 进程管道时如何避免标准输入上的重复输入

带有标准输出重定向的`boost :: process`在Ubuntu 16中随机失败

依赖于 R 中非标准评估的函数的包装器

LLDB 重定向劣质标准输出