首页 > 解决方案 > 关于使用 dplyr 和 tidy 评估进行 R 编程的问题

问题描述

伙计们,我有几个关于如何使用 dplyr 进行整洁评估的问题

以下代码使用 mtcars 数据集按气缸生成汽车计数:

mtcars %>%
  select(cyl) %>%
  group_by(cyl) %>%
  tally()

按预期输出:

# A tibble: 3 x 2
    cyl     n
* <dbl> <int>
1     4    11
2     6     7
3     8    14

如果我想将分组因子作为变量传递,那么这将失败:

var <- "cyl"

mtcars %>%
  select(var) %>%
  group_by(var) %>%
  tally()

带有错误消息:

Error: Must group by variables found in `.data`.
* Column `var` is not found.

这也失败了:

var <- "cyl"

mtcars %>%
  select(var) %>%
  group_by({{ var}}) %>%
  tally()

生产输出:

# A tibble: 1 x 2
  `"cyl"`     n
* <chr>   <int>
1 cyl        32

但是,此代码按预期工作:

var <- "cyl"

mtcars %>%
  select(var) %>%
  group_by(.data[[ var]]) %>%
  tally()

产生预期的输出:

# A tibble: 3 x 2
    cyl     n
* <dbl> <int>
1     4    11
2     6     7
3     8    14

我对此有两个问题,想知道是否有人可以提供帮助!

  1. 为什么不select(var)使用任何 dplyr tidy 评估扩展(例如select({{ var }})or )也能正常工作select(.data[[ var ]])

  2. 什么是group_by()错误group_by({{ var }})group_by(.data[[ var ]])正确的?

非常感谢!

马特。

标签: rdplyrtidyeval

解决方案


这取决于这些功能如何工作并接受输入。

如果您查看?select此问题相关部分的文档是 -

这些助手从字符向量中选择变量:

all_of():匹配字符向量中的变量名。所有名称都必须存在,否则会引发越界错误。

any_of():与 all_of() 相同,但不为不存在的名称引发错误。

因此,您可以将all_ofand any_ofinselect与字符向量一起使用,因此在运行时会收到警告mtcars %>% select(var)

注意:在选择中使用外部向量是不明确的。ℹ 使用all_of(var)而不是var静音此消息。

并且没有警告mtcars %>% select(all_of(var))

group_by目前而言,没有这样的具体规定,您需要使用mtcars %>% group_by(.data[[var]]).


推荐阅读