R语言中双位数数值未纳入“小于/大于”分组命令的问题
R语言数值变量重编码分类变量问题:两位数数值未被正确分组
我是R语言新手,正在用它完成毕业论文。尝试将数据集中1-13的数值变量Number.of.Chronic.conditions重编码为分类变量,但所有两位数的数值(10、11、12、13)都没被分到创建的≥9因子水平里,附上我的代码及输出:
> Desc$Number.of.Chronic.conditions[Desc$Number.of.Chronic.conditions <=2] <- "≤2" > Desc$Number.of.Chronic.conditions[Desc$Number.of.Chronic.conditions >=3 & Desc$Number.of.Chronic.conditions <5] <- "3 - 4" > Desc$Number.of.Chronic.conditions[Desc$Number.of.Chronic.conditions >=5 & Desc$Number.of.Chronic.conditions <7] <- "5 - 6" > Desc$Number.of.Chronic.conditions[Desc$Number.of.Chronic.conditions >=7 & Desc$Number.of.Chronic.conditions <9] <- "7 - 8" > Desc$Number.of.Chronic.conditions[Desc$Number.of.Chronic.conditions >=9] <- "≥9" > > Desc$Number.of.Chronic.conditions <- factor(Desc$Number.of.Chronic.conditions) > print(Desc$Number.of.Chronic.conditions) [1] 5 - 6 7 - 8 ≤2 5 - 6 5 - 6 3 - 4 7 - 8 ≤2 7 - 8 3 - 4 5 - 6 ≤2 5 - 6 ≥9 ≤2 5 - 6 5 - 6 7 - 8 10 [20] 7 - 8 11 7 - 8 5 - 6 ≤2 3 - 4 5 - 6 ≥9 5 - 6 7 - 8 3 - 4 3 - 4 5 - 6 ≤2 ≤2 5 - 6 3 - 4 7 - 8 3 - 4 [39] ≤2 7 - 8 5 - 6 7 - 8 7 - 8 5 - 6 10 ≤2 ≤2 ≤2 ≤2 3 - 4 3 - 4 ≤2 ≤2 ≤2 7 - 8 ≤2 ≤2 [58] 7 - 8 ≤2 3 - 4 3 - 4 ≤2 13 3 - 4 3 - 4 3 - 4 7 - 8 5 - 6 3 - 4 5 - 6 3 - 4 5 - 6 5 - 6 5 - 6 3 - 4 3 - 4 [77] 5 - 6 ≥9 ≤2 ≤2 10 3 - 4 7 - 8 11 7 - 8 5 - 6 3 - 4 3 - 4 ≥9 3 - 4 3 - 4 5 - 6 3 - 4 7 - 8 5 - 6 [96] 5 - 6 3 - 4 12 10 ≤2 5 - 6 5 - 6 3 - 4 3 - 4 3 - 4 5 - 6 5 - 6 3 - 4 5 - 6 ≤2 5 - 6 3 - 4 5 - 6 3 - 4 [115] 3 - 4 ≤2 5 - 6 7 - 8 3 - 4 ≤2 3 - 4 7 - 8 5 - 6 7 - 8 5 - 6 ≤2 7 - 8 ≤2 ≤2 ≥9 7 - 8 ≥9 3 - 4 [134] 5 - 6 ≤2 5 - 6 3 - 4 ≤2 3 - 4 3 - 4 ≤2 5 - 6 3 - 4 ≤2 7 - 8 3 - 4 ≤2 ≤2 3 - 4 3 - 4 ≤2 10 [153] 3 - 4 5 - 6 5 - 6 5 - 6 5 - 6 3 - 4 5 - 6 5 - 6 5 - 6 7 - 8 5 - 6 5 - 6 5 - 6 10 5 - 6 3 - 4 3 - 4 ≤2 3 - 4 [172] ≤2 7 - 8 ≤2 ≤2 7 - 8 ≤2 7 - 8 10 5 - 6 ≥9 3 - 4 3 - 4 Levels: ≤2 ≥9 10 11 12 13 3 - 4 5 - 6 7 - 8 > summary(Desc$Number.of.Chronic.conditions) ≤2 ≥9 10 11 12 13 3 - 4 5 - 6 7 - 8 40 7 7 2 1 1 49 49 27
问题原因
第一次赋值Desc$Number.of.Chronic.conditions[Desc$Number.of.Chronic.conditions <=2] <- "≤2"会将原本的数值型列强制转换为字符型。后续的条件判断(比如>=9)是在字符型变量上执行的,而字符比较是按ASCII码顺序进行的——"10"的首字符"1"ASCII码小于"9",因此无法匹配>=9的条件,导致两位数数值保留原始字符值,未被重编码。
解决方案
方案1:基于原始数值列判断(避免提前转字符)
先复制原始数值列,基于复制列做条件判断,防止类型转换干扰后续逻辑:
# 复制原始数值列作为临时变量 Desc$temp <- Desc$Number.of.Chronic.conditions # 基于数值型临时列执行重编码 Desc$Number.of.Chronic.conditions[Desc$temp <=2] <- "≤2" Desc$Number.of.Chronic.conditions[Desc$temp >=3 & Desc$temp <5] <- "3 - 4" Desc$Number.of.Chronic.conditions[Desc$temp >=5 & Desc$temp <7] <- "5 - 6" Desc$Number.of.Chronic.conditions[Desc$temp >=7 & Desc$temp <9] <- "7 - 8" Desc$Number.of.Chronic.conditions[Desc$temp >=9] <- "≥9" # 转换为因子并删除临时列 Desc$Number.of.Chronic.conditions <- factor(Desc$Number.of.Chronic.conditions) Desc$temp <- NULL # 验证结果 summary(Desc$Number.of.Chronic.conditions)
方案2:用cut()函数(专业分箱工具)
cut()函数是R中专门用于数值分箱的工具,直接指定区间和标签即可,无需手动编写判断逻辑:
Desc$Number.of.Chronic.conditions <- cut( Desc$Number.of.Chronic.conditions, breaks = c(-Inf, 2, 4, 6, 8, Inf), labels = c("≤2", "3 - 4", "5 - 6", "7 - 8", "≥9"), include.lowest = TRUE # 确保包含区间端点值 ) # 验证结果 summary(Desc$Number.of.Chronic.conditions)
方案3:用dplyr::case_when()(tidyverse风格)
如果习惯使用tidyverse语法,case_when()提供更直观的分支判断:
library(dplyr) Desc <- Desc %>% mutate(Number.of.Chronic.conditions = case_when( Number.of.Chronic.conditions <=2 ~ "≤2", between(Number.of.Chronic.conditions, 3, 4) ~ "3 - 4", between(Number.of.Chronic.conditions, 5, 6) ~ "5 - 6", between(Number.of.Chronic.conditions, 7, 8) ~ "7 - 8", Number.of.Chronic.conditions >=9 ~ "≥9" ) %>% factor()) # 验证结果 summary(Desc$Number.of.Chronic.conditions)
内容的提问来源于stack exchange,提问作者Vinh_PPH
相关产品推荐
相关产品推荐

