You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 07:40:24