You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dplyr中cur_data()弃用后,非列访问场景如何用pick()替代

解决dplyr中cur_data()弃用后的替代问题

直接替换cur_data()的写法

cur_data()在dplyr 1.1.0及以后版本被弃用,要获取当前上下文的全部数据集,可以用pick(everything())替代,修改后的代码如下:

library(dplyr)

VARS <- c("mpg", "disp")

mtcars |> 
  filter(if_all(all_of(VARS), 
                ~ .x >= min(filter(pick(everything()), as.logical(am)) |> pull(.x)) ))

pick(everything())会获取当前管道中的所有列,和原cur_data()的作用完全一致,不会再触发弃用警告。

更优雅的优化写法

在filter里嵌套filter会降低代码可读性,更推荐提前计算出am=1时目标变量的最小值,再用这些值过滤数据:

# 先计算am=1时各目标变量的最小值
min_vals <- mtcars |>
  filter(as.logical(am)) |>
  summarise(across(all_of(VARS), min))

# 执行过滤:所有目标变量都大于等于对应最小值
mtcars |>
  filter(if_all(all_of(VARS), ~ .x >= min_vals[[cur_column()]]))

这种写法逻辑更清晰,运行效率也更高,尤其适合处理大规模数据集。

为什么.data替代会失败?

.data是dplyr中的列引用代词,它只能用来单独引用某一列,不是完整的数据框对象,所以不能直接传入filter()函数中使用,这就是你尝试.data报错的原因。

内容的提问来源于stack exchange,提问作者Rico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:35:15