使用dplyr/tidyverse按指定列及条件筛选数据集的问题求助
解决dplyr条件子集化的问题
你遇到的问题是因为filter_at这类旧版范围动词(scoped verbs)在新版dplyr中已被更灵活的if_all()、if_any()替代,直接使用旧语法可能出现异常。以下是对应需求的正确写法:
1. 替代filter_at(vars(starts_with("x")), all_vars(. < 10))
要保留所有以x开头的列都小于10的行,使用if_all()结合filter():
filter(your_data, if_all(starts_with("x"), ~ .x < 10))
2. 替代filter_at(vars(starts_with("x")), any_vars(. < 10))
要保留至少一个以x开头的列小于10的行,使用if_any()结合filter():
filter(your_data, if_any(starts_with("x"), ~ .x < 10))
补充说明
- 新版dplyr(1.0.0及以上)推荐使用
if_all()/if_any()替代旧的_if/_at/_all系列函数,新语法更统一,兼容性更强。 - 若坚持使用旧语法,需确保dplyr版本低于1.0.0,但不推荐这种做法——旧函数已被标记为弃用,后续版本可能彻底移除。
举个实际例子验证效果:
library(tidyverse) # 构造测试数据集 df <- tibble(x1 = c(5, 15, 8), x2 = c(7, 9, 12), y = c("a", "b", "c")) # 保留所有x开头列都<10的行 filter(df, if_all(starts_with("x"), ~ .x < 10)) # 结果仅保留第一行 # 保留至少一个x开头列<10的行 filter(df, if_any(starts_with("x"), ~ .x < 10)) # 结果保留全部三行
内容的提问来源于stack exchange,提问作者Herr Student
相关产品推荐
相关产品推荐

