R语言基于已有列创建分类变量输出分类数异常问题求解
问题原因
你写的嵌套ifelse()代码出现分类缺失,核心是三个问题:
- 嵌套
ifelse()是顺序排他执行逻辑:只要靠前的判断条件成立,后续所有分支都会被直接跳过,不会执行。比如某条记录同时满足cough==1和neurologic==1,代码会直接返回"cough",根本不会进入后续neurologic的判断流程。如果排在靠后的两类症状(neurologic、otherSymp)的所有阳性记录,都同时伴随前面任意一种优先级更高的症状,这两个分类就完全不会出现在输出结果里,自然凑不齐预期的6个分类。 - 拼写与变量类型不匹配:你代码中给otherSymp的赋值文本写的是
"other symtomes",存在拼写错误,如果后续统计时按预期的"other symptoms"匹配计数,会直接漏算这个分类;另外要先核对所有二值变量的类型,如果变量是字符型的"1"/"0",你写==1(数值型判断)会永远不成立,对应分类自然不会生成,还要核对你写的dispnea是不是和原始数据里的变量名完全一致,变量名拼错也会导致判断失效。 - 括号匹配风险:6层嵌套的ifelse有大量成对括号,只要某一层括号位置写错,就会把后续的判断逻辑排除在分支外,导致后面的分类完全不生效。
另外要注意:你当前的写法本身就有逻辑漏洞,完全没有处理同一个案同时存在多种症状的场景,所有共病记录都会被错误归到优先级最高的靠前症状中,统计结果会存在偏差。
正确实现方案
根据你的实际分析需求选对应方案即可:
方案1:保留单症状标记逻辑(按优先级返回单个症状)
如果你的分析设计就是要给每个个案标记单个优先级最高的症状,不要写容易出错的嵌套ifelse,用dplyr包的case_when()实现,逻辑清晰不容易写错:
library(dplyr) df <- df |> mutate( # 先统一把症状变量转成数值型,避免字符型1/0判断失效 across(c(cough, fever, diarrhea, dispnea, neurologic, otherSymp), as.numeric), symptoms = case_when( cough == 1 ~ "cough", fever == 1 ~ "fever", diarrhea == 1 ~ "diarrhea", dispnea == 1 ~ "dispnea", neurologic == 1 ~ "neurologic", otherSymp == 1 ~ "other symptoms", TRUE ~ NA_character_ ) )
注意:case_when()里的条件顺序就是优先级顺序,排在越前面的症状优先级越高,共病时只会返回最靠前的症状名,需要调整优先级直接调换条件行的顺序即可。
方案2:准确标记所有症状(推荐,避免共病漏记)
如果需要记录患者同时存在的多种症状,不要强行生成单分类变量,否则会丢失共病信息,可以把每个个案的所有阳性症状拼接为组合标签:
library(dplyr) df <- df |> mutate( across(c(cough, fever, diarrhea, dispnea, neurologic, otherSymp), as.numeric), symptoms = paste( ifelse(cough == 1, "cough", NA), ifelse(fever == 1, "fever", NA), ifelse(diarrhea == 1, "diarrhea", NA), ifelse(dispnea == 1, "dispnea", NA), ifelse(neurologic == 1, "neurologic", NA), ifelse(otherSymp == 1, "other symptoms", NA), sep = ";" ) |> gsub("(;NA|NA;)", "", x = _) |> na_if("") )
这种写法下,同时存在咳嗽和发热的个案会被标记为cough;fever,不会出现症状被优先级覆盖的问题,所有存在阳性记录的症状分类都能被正常统计到。
内容的提问来源于stack exchange,提问作者José Luna
相关产品推荐
相关产品推荐

