如何让含all()的R函数支持向量化并处理缺失值?
在R中实现逐元素多条件检查函数(支持NA处理)
你可以用mapply来实现这个需求,它会逐元素遍历所有输入的条件向量,对每个位置的条件值调用all()并指定na.rm参数,最终返回与输入向量长度一致的布尔向量,完全不需要用&链式写法:
funV <- function(..., na.rm = FALSE) { mapply(function(...) all(c(...), na.rm = na.rm), ...) }
示例测试
假设我们有两个条件向量:
a <- c(TRUE, TRUE, FALSE, NA) b <- c(TRUE, FALSE, TRUE, TRUE)
启用na.rm = TRUE时的结果
funV(a, b, na.rm = TRUE) # 输出:[1] TRUE FALSE FALSE TRUE
- 第一个位置:两个条件都是
TRUE→ 返回TRUE - 第二个位置:存在
FALSE→ 返回FALSE - 第三个位置:存在
FALSE→ 返回FALSE - 第四个位置:非NA条件是
TRUE,na.rm = TRUE忽略NA → 返回TRUE
禁用na.rm时的结果
funV(a, b, na.rm = FALSE) # 输出:[1] TRUE FALSE FALSE NA
第四个位置因为存在NA,所以返回NA,符合all()的默认行为。
多条件扩展
这个函数还支持传入任意多个条件向量,比如再加一个向量c:
c <- c(TRUE, TRUE, TRUE, NA) funV(a, b, c, na.rm = TRUE) # 输出:[1] TRUE FALSE FALSE TRUE
原理说明
mapply会自动对齐所有输入向量的元素位置,每次取每个向量的同位置元素组成参数,传给内部的匿名函数- 匿名函数将当前位置的所有条件值打包成向量,调用
all(..., na.rm = na.rm)判断该位置是否所有非NA条件都为TRUE - 最终将每个位置的判断结果组合成布尔向量返回
内容的提问来源于stack exchange,提问作者DuesserBaest
相关产品推荐
相关产品推荐

