如何在R中基于OR和AND逻辑生成仅识别疼痛/肿胀的二值新列
原有代码问题梳理
- 逻辑运算符优先级错误:
|(或)的优先级低于&(且),未将「Pain或Swelling为1」的条件用括号包裹,导致实际判断逻辑完全不符合需求 - 语法错误:判断
df$Nausea是否为0时误用了赋值符=而非相等判断符==;最后一个判断条件后多了冗余的&符号 - 逻辑遗漏:未将
None字段加入判断,规则要求除Pain、Swelling外所有字段都为0,None字段也需要满足取值为0的条件
修正后代码
直接修改原有写法的版本
df$OnlyPainOrSwelling <- 1L * ( # 先把Pain或Swelling为1的条件用括号包裹,保证逻辑优先级正确 (df$Pain == 1 | df$Swelling == 1) & df$None == 0 & df$Tiredness == 0 & df$Headache == 0 & df$Nausea == 0 & df$Malaise == 0 & df$Lymph == 0 )
更简洁的通用写法(适用于字段多的场景)
通过行求和直接判断除目标字段外其余字段是否全为0,无需逐个写判断条件:
# 计算除Pain、Swelling外所有字段的行和,行和为0说明其余字段全为0 other_symptoms_sum <- rowSums(df[, setdiff(colnames(df), c("Pain", "Swelling"))]) # 同时满足两个条件则赋值为1,否则为0 df$OnlyPainOrSwelling <- 1L * (other_symptoms_sum == 0 & (df$Pain == 1 | df$Swelling == 1))
样例数据运行结果
用你提供的6行样例数据运行后,新列OnlyPainOrSwelling的取值依次为0,1,0,0,0,0,完全符合需求规则。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

