使用ifelse()函数重编码数据集age列为young、middle、old三类的问题
问题原因
- 第一行代码执行后,原本为数值类型的
age列被修改为字符串类型,仅保留"young"和"middle"两个取值,无法和数值53进行大小比较。R语言中字符串与数值比较默认返回FALSE,因此第二行ifelse会将所有值统一赋值为"middle"。 - 即使没有修改列类型,分步赋值的逻辑也存在设计缺陷:大于53岁的群体在第一行执行时就会被错误标记为
"middle",后续调整逻辑冗余且容易出错。
正确实现方案
方案1:嵌套ifelse
从最严格的阈值开始判断,避免逻辑覆盖:
PU6_exercise_data$age <- ifelse(PU6_exercise_data$age < 28, "young", ifelse(PU6_exercise_data$age <= 53, "middle", "old"))
方案2:使用cut函数(更推荐分箱场景)
专门的分箱函数,代码可读性更高:
PU6_exercise_data$age <- cut(PU6_exercise_data$age, breaks = c(-Inf, 27, 53, Inf), labels = c("young", "middle", "old"))
如果需要调整区间开闭规则,可以修改right参数,例如设置right = FALSE可将区间改为左闭右开
内容的提问来源于stack exchange,提问作者Erdem Akca
相关产品推荐
相关产品推荐

