请教:R中if_any(any_of(vars))与if_any(all_of(vars))的区别
问题背景
给定如下数据框和需求:
df <- data.frame(a=c(TRUE, TRUE, FALSE), b=c(FALSE, TRUE, FALSE)) myvars <- c("a","b")
需要生成列c,规则是每行中a或b任意一个为TRUE时,c对应行值为TRUE,且必须通过字符向量myvars指定变量列表。
最初执行代码df %>% mutate(c=if_any(myvars))时收到弃用警告,提示需改用all_of()或any_of()包裹外部向量,因此衍生出两种写法:
df %>% mutate(c=if_any(any_of(myvars))) df %>% mutate(c=if_any(all_of(myvars)))
all_of() 与 any_of() 的核心区别
这两个函数的作用是确定要纳入计算的列范围,和if_any本身的行级逻辑(判断行内是否有任意TRUE)完全独立,核心差异在于对不存在变量的处理:
- all_of(myvars):强制要求字符向量中的所有变量名必须存在于数据框中,若有不存在的变量,直接抛出错误。
例如若myvars <- c("a","b","d"),使用all_of会报错,因为df中没有d列。 - any_of(myvars):仅匹配数据框中存在的变量,自动忽略不存在的变量名,程序不会报错。
同样用myvars <- c("a","b","d"),any_of会只基于a和b列计算c,结果和原需求一致。
适用场景总结
- 当你能确保
myvars中的所有变量都存在于目标数据框时,两种写法的计算结果完全相同。 - 当
myvars可能包含不存在的变量(比如动态生成的变量列表),使用any_of()更安全,避免程序因变量缺失中断。
内容的提问来源于stack exchange,提问作者robertspierre
相关产品推荐
相关产品推荐

