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
相关产品推荐
相关产品推荐

