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

case_when生成APPROVAL列值异常,为何首个Lower than Benchmark未得0?

问题原因分析

你对case_when的逻辑理解有误——它不是按你写的条件顺序对应表格的每一行,而是对整个数据列做向量级的条件判断,按条件的先后顺序匹配第一个满足的规则。

看你的数据细节:

  • 第二行VALUE=500,虽然CRITERIA是"Lower than Benchmark",但它先满足了第一个全局条件VALUE >=0.9,所以直接返回1,不会走到后面的VALUE < BENCHMARK条件。
  • 你重复写的条件(比如两次VALUE >=0.9)完全没必要,case_when会逐行检查所有条件,第一个匹配的规则就会生效。
正确写法

你需要结合CRITERIA列的规则来做针对性判断,而不是给每一行写单独的条件:

library(tibble)
library(dplyr)

tibble(
  KPI = c("1 KPI","2 KPI","3 KPI","4 KPI","5 KPI"),
  VALUE = c(1,500,1,0.20,7.88),
  BENCHMARK = c(0,473,0,0.39,6.8),
  CRITERIA = c(">=90%", "Lower than Benchmark", ">=90%","Lower than Benchmark","Higher than Benchmark")
) %>%
  mutate(APPROVAL = case_when(
    CRITERIA == ">=90%" & VALUE >= 0.9 ~ 1,
    CRITERIA == "Lower than Benchmark" & VALUE < BENCHMARK ~ 1,
    CRITERIA == "Higher than Benchmark" & VALUE > BENCHMARK ~ 1,
    TRUE ~ 0
  ))

这样每个行的判断会绑定对应CRITERIA的规则,只有当该行的规则条件满足时才返回1,否则返回0。比如第二行CRITERIA是"Lower than Benchmark",但500 < 473不成立,所以APPROVAL会返回0,符合你的预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:31:18