R 中如何复用相同条件简化两个 case_when()?
数据小陈
结论
可以先用一个 case_when() 将 color 分成三组,再通过命名向量生成 kpi_a 和 kpi_b。这样只需写一次条件判断,同时能让 kpi_a 保持字符型、kpi_b 保持数值型。
library(dplyr)
diamonds %>%
mutate(
.bucket = case_when(
color %in% c("E", "I") ~ "ei",
color %in% c("J", "H") ~ "jh",
TRUE ~ "other"
),
kpi_a = unname(c(ei = "A", jh = "B", other = "C")[.bucket]),
kpi_b = unname(c(ei = 1.1, jh = 1.2, other = 2)[.bucket])
) %>%
select(-.bucket)
.bucket 保存分组结果。接下来的两行分别用它索引字符型和数值型命名向量。unname() 会移除索引结果的名称,避免名称随结果保留。最后,select(-.bucket) 删除临时列。
为什么要分两步
case_when() 每次返回一个向量,因此各分支的结果需要类型兼容。这里一列返回字符("A"、"B"、"C"),另一列返回数值(1.1、1.2、2),所以生成两列时仍要分别映射结果。先把条件判断集中到 .bucket,就不必重复写条件。
如果后续还要保留分组信息,可以省略 select(-.bucket),并按需要修改临时列名。
备注:内容仅供参考。
