dplyr外部变量分组遗留代码更新:方案等价性与兼容周期问询
dplyr分组代码的版本兼容与最佳实践问题
我有大量使用dplyr按程序指定变量进行分组的遗留代码,这些代码采用的方法目前已被弃用或取代。在简单案例中,多种替代方法结果与原代码一致,但想了解边缘场景下是否真正等价。
跳过早期为解决非标准求值(NSE)难题使用quo、enquo等工具的阶段,以下是可复现示例:
已弃用的group_by_()写法
library(dplyr) Var1 <- "gear" Var2 <- "cyl" test1 <- mtcars %>% group_by_(Var1, Var2) %>% summarise(Mean_mpg = mean(mpg))
该代码仍可运行,但提示group_by_()在dplyr 0.7.0中已被弃用。
已被取代的group_by_at()写法
test2 <- mtcars %>% group_by_at(c(Var1, Var2)) %>% summarise(Mean_mpg = mean(mpg))
该代码可正常运行,但文档显示其已被取代,建议使用across()。
基于across()的初步替代写法
test3 <- mtcars %>% group_by(across(c(Var1, Var2))) %>% summarise(Mean_mpg = mean(mpg))
可正常运行,但出现警告提示需用all_of()或any_of()替代外部向量选择。
修正后的across()+all_of()写法
test4 <- mtcars %>% group_by(across(all_of(c(Var1, Var2)))) %>% summarise(Mean_mpg = mean(mpg))
《Programming with dplyr》中的另一种写法
test5 <- mtcars %>% group_by(across(c({{Var1}}, {{Var2}}))) %>% summarise(Mean_mpg = mean(mpg))
在dplyr 1.1.4的简单案例中,五种方法结果完全一致:
sapply(list(test2, test3, test4, test5), identical, test1)
核心疑问
- 仅针对向分组函数传入少量变量的场景,是否存在底层原因(如性能、错误捕获)要求更新test1和test2这类生产代码?
- 若需更新,最新推荐写法是什么?即
group_by_(Var1, Var2)与group_by(across(all_of(c(Var1, Var2))))是否完全等价? group_by_()和group_by_at()大概还会被支持多久,包含这些方法的遗留代码何时会失效?
内容的提问来源于stack exchange,提问作者Knackiedoo
相关产品推荐
相关产品推荐

