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

如何在R语言中基于type条件使用case_when创建新变量

解决基于不同type变量应用不同case_when规则生成新变量的问题

你的代码无法运行的核心原因:if (type == 1)是对整个type向量做判断,而dplyr管道需要逐行处理逻辑,且if仅接受标量(单个TRUE/FALSE)条件,用向量触发判断会报错。另外你第一个case_when的条件顺序有问题——number < 400会覆盖number < 200的情况,导致永远不会生成"small",需要调整条件优先级。

方案1:嵌套case_when(推荐)

在单个mutate中,先通过外层case_when区分type,再在每个分支里写入对应规则,同时修正条件顺序:

library(tidyverse)

dat <- tribble(
  ~number, ~type,
   232,      1,
   383,      2,
   832,      1,
   722,      2,
   134,      1,
   211,      2,
   970,      1
)

# 正确实现逻辑
dat |>
  mutate(size = case_when(
    # type=1的规则:先判断更严格的小数值条件
    type == 1 ~ case_when(
      number < 200 ~ "small",
      number < 400 ~ "medium",
      number > 400 ~ "big"
    ),
    # type=2的规则
    type == 2 ~ case_when(
      number > 700 ~ "super big",
      between(number, 400, 700) ~ "quite medium",
      number < 400 ~ "quite small"
    )
  ))

运行后得到符合预期的结果:

# A tibble: 7 × 3
  number  type size        
   <dbl> <dbl> <chr>       
1    232     1 medium      
2    383     2 quite small 
3    832     1 big         
4    722     2 super big   
5    134     1 small       
6    211     2 quite small 
7    970     1 big         

方案2:按type分组后分别处理

如果规则差异极大,也可以通过分组实现,分组后对不同type应用独立逻辑:

dat |>
  group_by(type) |>
  mutate(size = case_when(
    current_group()$type == 1 ~ case_when(
      number < 200 ~ "small",
      number < 400 ~ "medium",
      number > 400 ~ "big"
    ),
    current_group()$type == 2 ~ case_when(
      number > 700 ~ "super big",
      between(number, 400, 700) ~ "quite medium",
      number < 400 ~ "quite small"
    )
  )) |>
  ungroup()

该方案与方案1结果完全一致,适合规则复杂度高的场景。

内容的提问来源于stack exchange,提问作者Andrés Lagerlöf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 10:23:35