R语言case_when条件突变时如何对变量列表批量调用is.na
R语言dplyr批量判断多变量缺失的简化实现
需求说明
处理调研问卷数据时需要区分「题项不适用」和「真实漏答」两类记录:
x1、x2为核心回答题项,仅当受访者判定x1、x2均不适用时才会填写x3- 取值规则如下:
- x3填报"None of the above"时取值为1
- 核心题项有有效回答、x3未选上述选项时取值为0,对应不适用场景
- x1、x2等所有核心题项均未作答时判定为真实漏答,x3取缺失值
- 现有代码可正常实现规则,但核心题项数量较多(10个以上)时,逐变量写
is.na(xx) & is.na(yy)的拼接语句维护成本高,需要支持直接引用预定义变量列表的简化写法。
原有可运行代码
library(dplyr) df3 <- tibble(x1 = c("Yes", "No", NA, NA), x2 = c("Yes", "Yes", NA, NA), x3 = c(NA, NA, NA, "None of the above")) list <- c("x1", "x2") df3 %>% mutate( x3 = coalesce(as.integer(x3 == "None of the above"), 0), x3 = case_when( x3 == 1 ~ 1, is.na(x1) & is.na(x2) ~ NA_real_, TRUE ~ 0))
简化实现方案
直接使用dplyr内置的if_all()函数,搭配all_of()引用预定义的核心题项向量即可,无需手动拼接多变量判断语句:
library(dplyr) df3 <- tibble(x1 = c("Yes", "No", NA, NA), x2 = c("Yes", "Yes", NA, NA), x3 = c(NA, NA, NA, "None of the above")) # 预定义所有核心题项的变量名,后续增减变量仅需修改这个向量 core_items <- c("x1", "x2") df3 %>% mutate( x3 = case_when( x3 == "None of the above" ~ 1, # 一次性判断core_items内所有变量是否均为NA if_all(all_of(core_items), is.na) ~ NA_real_, TRUE ~ 0 ) )
实现说明
if_all()会对指定列集合逐行判断是否全部满足给定条件(这里是is.na()),返回布尔向量,完全替代手动拼接的多变量&判断逻辑- 不要将存储变量名的对象命名为
list,这是R的内置基础函数,直接覆盖容易引发不可预期的报错 - 运行结果和原代码完全一致:第1、2行x3取值为0,第3行(所有核心题项未答)为缺失值,第4行取值为1,符合预期规则
- 后续核心题项数量增减时,仅需要修改
core_items向量的内容,不需要调整mutate内的判断逻辑,维护成本极低。
内容的提问来源于stack exchange,提问作者VancityPlanner
相关产品推荐
相关产品推荐

