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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:06:15