简化多变量同条件case_when()用法及批量生成变量方法
批量生成多类别成绩的不及格标记变量
核心方案:用dplyr的if_any() + 批量变量匹配
针对你需要为每个考试类别(如exam、quiz)批量生成"是否存在成绩<70"标记变量的需求,无需手动编写大量case_when(),可以通过dplyr的if_any()结合变量前缀匹配实现高效处理。
步骤1:构造示例数据
先模拟包含多类别成绩的数据集:
library(dplyr) set.seed(123) df <- tibble( id = 1:5, exam_1 = sample(60:100, 5), exam_2 = sample(60:100, 5), quiz_1 = sample(60:100, 5), quiz_2 = sample(60:100, 5), quiz_3 = sample(60:100, 5) )
步骤2:针对已知类别批量生成标记变量
如果已知所有考试类别(如exam、quiz),直接用starts_with()匹配同类别变量,结合if_any()判断是否存在不及格成绩:
df <- df %>% mutate( # 生成exam类别的标记:任意exam成绩<70则标记"有不及格",否则"无不及格" exam_has_low = ifelse(if_any(starts_with("exam"), ~ .x < 70), "有不及格", "无不及格"), # 生成quiz类别的标记 quiz_has_low = ifelse(if_any(starts_with("quiz"), ~ .x < 70), "有不及格", "无不及格") )
步骤3:自动识别类别,批量处理所有类别
如果考试类别数量多,无需手动枚举,可自动提取类别前缀后循环处理:
# 提取所有成绩变量的类别前缀(假设变量格式为"类别_编号") score_vars <- names(df)[grepl("^[a-z]+_[0-9]+$", names(df))] categories <- unique(sub("_\\d+$", "", score_vars)) # 循环为每个类别生成标记变量 for (cat in categories) { df <- df %>% mutate( !!paste0(cat, "_has_low") := ifelse(if_any(starts_with(cat), ~ .x < 70), "有不及格", "无不及格") ) }
关键说明
if_any(starts_with(cat), ~ .x < 70):检查当前类别下的所有变量,只要有一个满足<70就返回TRUE!!paste0(cat, "_has_low") :=:用tidyeval语法动态生成变量名(如exam_has_low、quiz_has_low)- 若只需布尔值标记(TRUE/FALSE),可直接保留
if_any()的结果,无需嵌套ifelse
内容的提问来源于stack exchange,提问作者Casey
相关产品推荐
相关产品推荐

