R语言如何创建等样本量三分位数分组并查看分割点?
解决三分位数分组与分割点获取的问题
我完全懂你遇到的麻烦——既要让三组样本量尽量接近333,又要拿到对应的分割点,之前试的几个函数各有缺陷对吧?别担心,咱们结合现有工具的优势,用两种可靠的方法来解决:
方法一:先计算三分位数分割点,再精准分组
这种方法先通过分位数函数拿到严格的三分位数边界,再用cut()完成分组,兼顾分割点的准确性和样本量的均匀性:
# 先设置随机种子保证结果可重复 set.seed(123) DF <- data.frame(var = rnorm(1000, 50, 15)) # 计算三分位数分割点,选择type=1匹配ntile的分组逻辑(保证样本量均匀) split_points <- quantile(DF$var, probs = c(1/3, 2/3), type = 1) split_points # 用分割点分组,注意包含所有边界值 DF$group <- cut(DF$var, breaks = c(-Inf, split_points, Inf), labels = c("Q1", "Q2", "Q3")) # 验证每组样本量 table(DF$group)
为什么这么做?
- 用
quantile(..., type=1)计算的分割点,会让分组样本量严格接近333(对于1000个数据,结果是333、333、334),解决了cut()默认均匀分割导致样本量不均的问题; - 直接拿到了明确的分割点数值,弥补了
ntile()看不到边界的缺陷。
方法二:先通过ntile分组,再提取实际分割点
如果你更看重样本量的绝对均匀,先使用ntile()完成分组,再从分组结果中提取实际的边界值:
set.seed(123) DF <- data.frame(var = rnorm(1000, 50, 15)) # 用ntile创建三分位数分组 DF$ntile_group <- ntile(DF$var, 3) # 提取每组的临界值作为分割点 q1_upper <- max(DF$var[DF$ntile_group == 1]) q2_upper <- max(DF$var[DF$ntile_group == 2]) split_points <- c(q1_upper, q2_upper) split_points # 确认样本量 table(DF$ntile_group)
这种方法的优势:
ntile()会严格把1000个数据分成333、333、334三组,样本量均匀性拉满;- 通过提取每组的最大值,得到的分割点是实际数据中的真实值,完全贴合分组的实际边界。
补充说明
如果你的数据中有大量重复值,可能会导致分组样本量略有偏差,这时候可以结合Hmisc包的cut2()函数,指定g=3并设置onlycuts=FALSE,既保证样本量均匀,又能拿到分割点:
library(Hmisc) set.seed(123) DF <- data.frame(var = rnorm(1000, 50, 15)) # 用cut2分组并获取分割点 cut_result <- cut2(DF$var, g=3, onlycuts=FALSE) DF$group <- cut_result split_points <- attr(cut_result, "cuts") split_points # 验证样本量 table(DF$group)
这种方法是cut2()的进阶用法,既解决了它默认不返回严格三分位数的问题,又能保证样本量均匀。
内容的提问来源于stack exchange,提问作者Schillerlocke
相关产品推荐
相关产品推荐

