R语言if else阶梯创建二分类变量结果异常排查
问题原因
你的代码存在两个核心错误,直接导致所有行返回结果为No:
- 数据类型不匹配:你提供的数据集构造代码中,
SMI和BMI两列的取值都被引号包裹,读入后为字符型变量,无法正确执行数值比较运算(</>=这类大小判断对字符型值会按字典序比较,和数值比较逻辑完全不同,甚至会直接抛出类型转换警告导致判断失效)。 - 函数使用错误:R原生的
if(){}else{}是单值判断语句,不支持向量化逐行运算。当你传入整列向量作为判断条件时,函数只会校验向量的第一个元素的逻辑结果,不会遍历每一行单独判断,最终只会返回1个值赋值给整列,自然无法得到逐行的正确结果。
修正代码
首先将SMI、BMI转为数值类型,再使用支持向量化运算的判断函数实现逐行赋值,两种常用实现方式如下:
方式1:嵌套ifelse()(无需加载额外包)
ifelse()是R内置的向量化判断函数,可以逐行返回判断结果:
# 先将字符型数值列转为数值类型 data$SMI <- as.numeric(data$SMI) data$BMI <- as.numeric(data$BMI) # 逐行判断赋值 data$Sarcopenia <- ifelse( data$Gender == "Female" & data$SMI < 41, "Yes", ifelse( data$Gender == "Male" & data$BMI >= 25 & data$SMI < 53, "Yes", ifelse( data$Gender == "Male" & data$BMI < 25 & data$SMI < 43, "Yes", "No" ) ) )
方式2:dplyr::case_when()(多分支场景可读性更强)
如果需要写多组判断条件,用case_when()的语法更清晰,不容易出现嵌套错误:
# 加载dplyr包,若未安装先运行install.packages("dplyr") library(dplyr) data <- data %>% mutate( SMI = as.numeric(SMI), BMI = as.numeric(BMI), Sarcopenia = case_when( Gender == "Female" & SMI < 41 ~ "Yes", Gender == "Male" & BMI >= 25 & SMI < 53 ~ "Yes", Gender == "Male" & BMI < 25 & SMI < 43 ~ "Yes", TRUE ~ "No" ) )
运行上述代码后即可得到符合逻辑的判断结果。
内容的提问来源于stack exchange,提问作者sabc04
相关产品推荐
相关产品推荐

