如何在mutate中结合if与case_when?R语言报错解决
R语言mutate中结合if与case_when的正确实现方法
原始数据与需求
先看原始数据框:
df_test <- data.frame(player = c('a', 'b', 'c', 'd', 'e'), position = c('G', 'F', 'F', 'G', 'G'), points = c(9, 15, 19, 22, 32), rebounds = c(5, 7, 7, 12, 11))
要新增rating列,规则如下:
- 仅当
points > 10时,根据篮板数赋值:- 篮板≥10 → 标记"good"
- 篮板≥7但不足10 → 标记"average"
- 篮板<7 → 标记NA
- 若
points ≤10,直接赋值NA
错误原因
你之前写的代码报错the condition has length > 1,问题出在用了基础的if()函数——这个函数只能处理单个值的判断,而mutate操作的是整列向量,必须用支持向量化的函数才行。
两种可行解决方案
方案1:if_else() + case_when()组合
if_else()是dplyr专门做向量化条件判断的函数,适配mutate的向量操作场景,结合case_when实现多层逻辑:
library(dplyr) df_test <- df_test %>% mutate(rating = if_else(points > 10, case_when( rebounds >= 10 ~ "good", rebounds >=7 ~ "average", TRUE ~ NA_character_ ), NA_character_))
注意事项:
- 外层
if_else先筛选出points>10的行,其余行直接赋值NA - 内层
case_when的条件要从严格到宽松排序,先判断≥10,再判断≥7,最后用TRUE~NA_character_兜底处理篮板<7的情况
方案2:直接在case_when()里写全条件
无需额外的if_else,直接把points>10作为每个判断的前置条件:
df_test <- df_test %>% mutate(rating = case_when( points >10 & rebounds >=10 ~ "good", points >10 & rebounds >=7 ~ "average", points >10 & rebounds <7 ~ NA_character_, TRUE ~ NA_character_ ))
最后一行TRUE~NA_character_负责处理所有points≤10的行,逻辑直接清晰。
最终运行结果
不管用哪种方案,最终得到的数据框如下:
player position points rebounds rating 1 a G 9 5 <NA> 2 b F 15 7 average 3 c F 19 7 average 4 d G 22 12 good 5 e G 32 11 good
内容的提问来源于stack exchange,提问作者GitZine
相关产品推荐
相关产品推荐

