按RunID分组判断组内是否存在指定诊断的R语言问题排查
错误原因及解决方案
错误根源
你代码里的any(diagnosis="Pneumonia")存在两个问题:
- 用了赋值运算符
=而非比较运算符==,导致any()接收的是字符型的诊断值,不是逻辑判断结果,触发类型转换警告。 - 未处理
diagnosis中的NA值,即便分组内有目标诊断,any()也可能返回NA。
修正方案
方案1:修正比较逻辑并忽略NA
library(dplyr) data %>% group_by(RunID) %>% mutate(Pneumonia = ifelse(any(diagnosis == "Pneumonia", na.rm = TRUE), 1, 0)) %>% ungroup()
方案2:用%in%简化逻辑
%in%适配字符型匹配,配合as.integer可直接将布尔值转为1/0:
data %>% group_by(RunID) %>% mutate(Pneumonia = as.integer(any("Pneumonia" %in% diagnosis, na.rm = TRUE))) %>% ungroup()
方案3:使用dplyr的if_any函数(适用于dplyr 1.0.0及以上版本)
data %>% group_by(RunID) %>% mutate(Pneumonia = as.integer(if_any(diagnosis, ~ .x == "Pneumonia", na.rm = TRUE))) %>% ungroup()
以上三种方案都能生成你需要的desired结果,既解决类型转换警告,又能正确标记分组内是否存在目标诊断。
内容的提问来源于stack exchange,提问作者John Ryan
相关产品推荐
相关产品推荐

