PAYATHON 2026

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),并按需要修改临时列名。

备注:内容仅供参考。