如何解决关于使用 dplyr 和 tidy 评估进行 R 编程的问题
伙计们,我有几个关于 dplyr 如何使用 tidy 评估的问题
以下代码使用 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
我对此有两个问题,想知道是否有人可以提供帮助!
-
为什么
select(var)
在不使用任何 dplyr tidy 评估扩展(例如select({{ var }})
或select(.data[[ var ]])
)的情况下也能正常工作? -
group_by()
是什么让group_by({{ var }})
错而group_by(.data[[ var ]])
正确?
非常感谢!
马特
解决方法
这取决于这些函数如何工作和接受输入。
如果您查看 ?select
处的文档,此问题的相关部分是 -
这些助手从字符向量中选择变量:
all_of():匹配字符向量中的变量名。所有名称都必须存在,否则会引发越界错误。
any_of():与 all_of() 相同,除了不存在的名称不会引发错误。
因此您可以在带有字符向量的 all_of
中使用 any_of
和 select
,因此您在运行 mtcars %>% select(var)
时会收到警告
注意:在选择中使用外部向量是不明确的。
ℹ 使用 all_of(var)
而不是 var
使此消息静音。
并且没有警告 mtcars %>% select(all_of(var))
。
就group_by
而言,没有这样的具体规定,您需要使用mtcars %>% group_by(.data[[var]])
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。