如何按指定分位数将样本划分为非均匀类别?
按自定义非均匀分位数区间划分样本(基于cut函数的分组实现)
要实现按0-20分位数、21-60分位数、61-100分位数这种非均匀区间划分,核心是先算出分组内对应分位数的阈值,再用cut()函数基于这些阈值切割变量。直接看修改后的可复用代码:
library(dplyr) set.seed(1) df <- tibble( V1 = round(runif(1000, min=1, max=1000)), V2 = as.factor(round(runif(1000, min=1, max=3))), V3 = as.factor(round(runif(1000, min=1, max=10))) ) # 按V2、V3分组,计算自定义分位数区间并划分 df <- df %>% group_by(V2, V3) %>% mutate( # 计算分组内的20%和60%分位数阈值 q20 = quantile(V1, 0.2, na.rm = TRUE), q60 = quantile(V1, 0.6, na.rm = TRUE), # 用cut划分区间,指定breaks和自定义标签 custom_quantile = cut( V1, breaks = c(-Inf, q20, q60, Inf), # 用-Inf和Inf确保覆盖所有极端值 labels = c("0-20分位数", "21-60分位数", "61-100分位数"), include.lowest = TRUE # 确保最小值被纳入第一个区间 ) ) %>% ungroup() # 按需取消分组,不影响后续操作的话也可以保留分组状态
关键细节说明
quantile(V1, c(0.2, 0.6)):在每个分组内精准计算对应分位数的临界值,这是实现非均匀区间的核心。cut()的breaks参数:用-Inf和Inf兜底,避免因为样本极值超出阈值范围而出现NA值。include.lowest = TRUE:确保样本中的最小值被正确归入第一个区间,不会出现边界值遗漏的问题。
验证区间分布(可选)
如果要确认每个分组内的区间占比是否符合预期,可以运行以下代码:
df %>% count(V2, V3, custom_quantile) %>% group_by(V2, V3) %>% mutate(占比 = n / sum(n))
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

