R中case_when函数未按预期工作,请求排查及NA值处理方案
问题分析与修正方案
1. 原代码的核心逻辑错误
第一个分组条件的括号位置有误,导致逻辑判断偏离预期:
原条件写法:
(EV1 >= 7 & EV1 <= 13 & EV2 == "4" | EV2 == "5")
会被R解析为:(EV1在7-13区间 且 EV2="4") 或者 EV2="5",这和你想要的「EV1在7-13区间,同时EV2是4或5」的逻辑不符。
2. 修正后的代码(含NA值处理)
size <- 30 a <- 7:13; b <- 14:21; L <- sapply(list(a, b), length) EV1 <- sample(c(a, b), size = size, prob = rep(c(0.42, 0.58) / L, L), replace = TRUE) # 模拟实际数据中的NA值 EV1[sample(1:size, 3)] <- NA EV2 <- sample(c(4,5,6, NA), size, replace=TRUE, prob = c(0.25,0.32,0.43, 0)) %>% as.factor() %>% as.data.frame() example_data <- as.data.frame(cbind(EV1,EV2)) colnames(example_data) <- c("EV1","EV2") example_data <- example_data %>% mutate( group = case_when( # 修正括号,明确逻辑:EV1在7-13之间,且EV2为4或5 (EV1 >= 7 & EV1 <= 13) & (EV2 == "4" | EV2 == "5") ~ 1, # EV1在7-13之间,且EV2为6 (EV1 >= 7 & EV1 <= 13) & EV2 == "6" ~ 2, # EV1大于等于14 EV1 >= 14 ~ 3, # 处理所有NA或不满足上述条件的情况,可按需修改标签 TRUE ~ NA_real_ ) )
3. 关键说明
- 逻辑修正:将
EV2 == "4" | EV2 == "5"用括号包裹,确保和EV1的区间条件保持「且」的关系。 - NA值处理:最后一行
TRUE ~ NA_real_会把所有不满足前三个条件的情况(包括EV1/EV2为NA的记录)标记为NA,你可以根据需求替换为特定标签(比如~ 0)。 - 因子类型适配:EV2是因子类型,用字符串
"4""5""6"比较是正确的;如果EV2是数值型,需要去掉引号直接用数字比较。
内容的提问来源于stack exchange,提问作者Khurram Ahmed
相关产品推荐
相关产品推荐

