在R语言中按指定窗口长度分布将数值范围划分为区间的方法咨询
窗口分割实现方案
基础逻辑
你给定的lens <- c(100, 100, 100, 50, 20)的经验分布为:长度100占比60%、50占比20%、20占比20%,我们只需要让最终生成的窗口长度的频率尽可能贴合该占比,同时保证窗口连续无重叠、覆盖1-20000的全部区间即可,以下是两种可落地的实现方案:
方案1:随机采样+末尾校准(实现最简单)
- 操作步骤:
- 从
lens向量中有放回随机采样窗口长度,直到所有采样长度的总和超过20000 - 调整最后一个窗口的长度,让所有窗口总长度刚好等于20000,避免超出区间
- 从
- R代码示例:
# 初始化参数 total_length <- 20000 lens <- c(100, 100, 100, 50, 20) # 固定随机种子保证结果可复现 set.seed(123) window_lens <- c() while(sum(window_lens) < total_length) { window_lens <- c(window_lens, sample(lens, size = 1)) } # 校准最后一个窗口长度,避免超出总区间 window_lens[length(window_lens)] <- window_lens[length(window_lens)] - (sum(window_lens) - total_length) # 生成每个窗口的起止点 window_df <- data.frame( start = c(1, cumsum(window_lens)[-length(window_lens)] + 1), end = cumsum(window_lens) )
- 优劣势:总长度越大,最后一个窗口的校准对整体分布的影响越小,20000的长度下几乎可以忽略分布偏差;仅可能出现1个不符合原长度取值的窗口,适合对分布要求不是绝对严格的场景。
方案2:次数求解+随机排序(完全匹配原长度取值)
如果要求所有窗口的长度必须是20/50/100三个值,不能有校准后的特殊长度,可以用整数约束求解各长度的出现次数:
约束公式:20x1 + 50x2 + 100*x3 = 20000,且x1/(x1+x2+x3)≈0.2、x2/(x1+x2+x3)≈0.2、x3/(x1+x2+x3)≈0.6(x1/x2/x3分别为长度20/50/100的出现次数)
- 操作步骤:
- 求解满足上述约束的正整数解,比如
x1=50、x2=40、x3=170,总长度刚好为20000,对应占比为19.2%、15.4%、65.4%,和原分布偏差极小,也可以调整参数得到更贴合的解 - 按求解的次数生成所有窗口长度的向量,打乱顺序后拼接即可得到连续窗口
- 求解满足上述约束的正整数解,比如
- R代码示例:
# 按求解的次数生成长度向量 window_lens <- rep(c(20,50,100), c(50,40,170)) # 打乱顺序,避免长度聚集 window_lens <- sample(window_lens) # 生成窗口起止点 window_df <- data.frame( start = c(1, cumsum(window_lens)[-length(window_lens)] + 1), end = cumsum(window_lens) )
- 优劣势:所有窗口长度都符合原取值要求,分布偏差可控;需要先求解次数,适合对窗口长度有严格要求的场景。
内容的提问来源于stack exchange,提问作者Rachel Rap
相关产品推荐
相关产品推荐

