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

