基于dplyr多列取值的复杂case_when()语句简化方案咨询
简化偏倚风险分类case_when语句的可行方案
首先你提供的示例数据构造代码中,Q6_long_name行末尾缺少逗号,修正后可正常运行。
方案1:使用if_all()/if_any()合并多列同规则判断
这是dplyr 1.0.0及以上版本内置的行式判断函数,专门替代多列连续写&/|的冗长逻辑,不需要修改原数据列名,支持所有dplyr列选择器,可读性高:
library(dplyr) a %>% mutate(overall_rob = case_when( # 合并Q2、Q3的等于n判断逻辑 Q1_long_name == "y" & if_all(c(Q2_long_name, Q3_long_name), ~.x == "n") & Q5_long_name != "m" ~ "high", # 合并Q1、Q2、Q3的等于n判断逻辑 if_any(c(Q1_long_name, Q2_long_name, Q3_long_name), ~.x == "n") | Q5_long_name != "m" ~ "low", TRUE ~ "unclear" ))
如果涉及的列更多,还可以用matches("^Q[1-3]_")这类正则选择器匹配列,不需要写完整列名,进一步缩短代码。
方案2:临时定义短别名简化书写
如果各列判断规则差异大,无法用上述函数合并,可以在mutate()内部用大括号创建临时计算环境,给长列名定义短别名,别名仅在计算overall_rob时生效,完全不改动原数据的列名:
a %>% mutate(overall_rob = { q1 <- Q1_long_name q2 <- Q2_long_name q3 <- Q3_long_name q5 <- Q5_long_name case_when( q1 == "y" & q2 == "n" & q3 == "n" & q5 != "m" ~ "high", q1 == "n" | q2 == "n" | q3 == "n" | q5 != "m" ~ "low", TRUE ~ "unclear" ) })
内容的提问来源于stack exchange,提问作者Miguel Prieto
相关产品推荐
相关产品推荐

