You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

简化多变量同条件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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:35:21