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
相关产品推荐
相关产品推荐

