R语言case_when函数提取"no"响应失败问题排查
问题诊断
你的代码逻辑完全错误:case_when是顺序匹配,只要某一个症状等于"no"就会返回"NS",哪怕其他症状存在"yes",这直接导致筛选结果混入了有阳性症状的样本。另外TRUE分支的as.character用法无效,无法正确处理多个变量。
正确实现方案
目标是保留**所有已评估症状(非NA)全为"no"、且无任何"yes"**的样本,以下是两种可行的实现方式:
方式1:使用dplyr(推荐)
library(dplyr) # 直接筛选目标子集,无需额外标记列 no_symptoms <- data %>% rowwise() %>% # 仅检查非NA的症状,确保全部为"no" filter(all(c_across(headache:diarrhea)[!is.na(c_across(headache:diarrhea))] == "no")) %>% ungroup()
如果需要保留标记列:
data <- data %>% rowwise() %>% mutate(no_symptoms = case_when( all(c_across(headache:diarrhea)[!is.na(c_across(headache:diarrhea))] == "no") ~ "NS", TRUE ~ "S" )) %>% ungroup() no_symptoms <- data %>% filter(no_symptoms == "NS")
方式2:使用Base R
# 指定所有症状列 symptom_cols <- c("headache", "sickness", "coughing", "fatigue", "diarrhea") # 逐行判断:非NA症状全为no,且无yes no_symptoms <- data[apply(data[, symptom_cols], 1, function(x) { non_na_vals <- x[!is.na(x)] # 若没有任何评估记录(全NA),可根据需求调整返回值,这里默认排除 length(non_na_vals) > 0 && all(non_na_vals == "no") }), ]
核心逻辑说明
- 必须整行综合判断,而非单个症状独立判断
- 先过滤NA值,只关注被实际评估过的症状
- 只要存在任意一个"yes",或者有非NA的症状不是"no",就排除该样本
内容的提问来源于stack exchange,提问作者nobody
相关产品推荐
相关产品推荐

