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

如何用mutate和case_when基于虚拟变量构建累加式stringency得分?

解决case_when条件匹配优先级导致的stringency得分计算问题

问题出在case_when的执行逻辑:它会从上到下依次匹配条件,只要某一行满足前面的条件,就直接返回对应值,不再检查后续的条件。你当前代码里第一个条件a == 1 ~ 3会覆盖所有a=1的情况——不管b/c/d/e是否为1,后续的组合条件永远不会被触发。

解决方案:调整条件顺序

把包含更多变量的具体组合条件放在前面,把宽泛的单一变量条件放在最后,确保更复杂的组合先被匹配:

library(dplyr)
set.seed(2)
df <- data.frame(id = 1:20,
                 a = rbinom(20, 1, 0.6),
                 b = rbinom(20, 1, 0.6),
                 c = rbinom(20, 1, 0.6),
                 d = rbinom(20, 1, 0.6),
                 e = rbinom(20, 1, 0.6))

df <- df %>% mutate(stringency = case_when(
  # 多变量组合优先级最高
  a == 1 & b == 1 & c == 1 ~ 7,
  a == 1 & b == 1 & d == 1 ~ 9,
  a == 1 & b == 1 & e == 1 ~ 9,
  a == 1 & d == 1 ~ 11,
  a == 1 & e == 1 ~ 9,
  a == 1 & b == 1 ~ 6,
  a == 1 & c == 1 ~ 6,
  # 单一变量条件放在最后
  a == 1 ~ 3,
  # 所有不满足的情况返回0
  TRUE ~ 0
))

可选优化:加权求和(如果规则允许)

如果你的得分规则本质是线性加权(比如a基础分3,b加3,c加3,d加8,e加6),可以直接用加权计算替代case_when,代码更简洁且不容易出错:

df <- df %>% mutate(
  stringency = a*3 + b*3 + c*3 + d*8 + e*6
)

内容的提问来源于stack exchange,提问作者Joost Maxen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 04:45:18