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

R语言基于四分位数为data.frame添加z值低/中/高分类列的方法

实现方法

以下三种方案都可以直接在原数据框中新增分类列,你可以根据使用习惯选择:


方案1:使用cut()函数(最简洁,推荐)

cut()是R原生的区间分组专用函数,和你的分组逻辑完全匹配,结合dplyr管道符的写法如下:

library(dplyr)

sdss16 <- sdss16 %>%
  mutate(z_class = cut(
    z,
    # 定义三个区间的断点:负无穷到25分位、25分位到75分位、75分位到正无穷
    breaks = c(-Inf, quantile(z, 0.25, na.rm = TRUE), quantile(z, 0.75, na.rm = TRUE), Inf),
    # 对应三个区间的分类标签
    labels = c("Low", "Medium", "High"),
    # 保证分位边界值被归入左区间,和你现有筛选逻辑完全一致
    include.lowest = TRUE
  ))

方案2:使用case_when()(和你现有筛选逻辑完全对齐)

如果你想直接复用现在的筛选条件写代码,case_when()的逻辑更直观:

library(dplyr)

sdss16 <- sdss16 %>%
  mutate(z_class = case_when(
    z < quantile(z, 0.25, na.rm = TRUE) ~ "Low",
    z >= quantile(z, 0.25, na.rm = TRUE) & z < quantile(z, 0.75, na.rm = TRUE) ~ "Medium",
    z >= quantile(z, 0.75, na.rm = TRUE) ~ "High",
    # 保留原z为缺失值的行的分类为NA
    TRUE ~ NA_character_
  ))

方案3:Base R实现(无需加载任何扩展包)

如果你不想加载dplyr等第三方包,用原生语法也可以实现:

# 先计算25%、75%两个分位断点
q <- quantile(sdss16$z, c(0.25, 0.75), na.rm = TRUE)
# 直接给原数据框新增分类列
sdss16$z_class <- cut(sdss16$z, breaks = c(-Inf, q, Inf), labels = c("Low", "Medium", "High"), include.lowest = TRUE)

注意事项

  • 所有方案都加了na.rm = TRUE参数,因为你的z列存在4个缺失值,计算分位数时必须忽略缺失值才能正常运行
  • 最终生成的z_class列默认是因子类型,如果需要转换为字符型,可在赋值后调用as.character(z_class)转换

内容的提问来源于stack exchange,提问作者Jim421616

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 00:36:08