R语言实现父向量拆分为等长重叠子向量并合并末尾不足长度子向量
固定长度重叠子向量拆分实现(末尾短块合并逻辑)
核心需求
- 将父向量拆分为多个固定长度的重叠子向量
- 若最后生成的子向量长度不足设定的子向量长度,将其与倒数第二个子向量合并
原有实现问题
原有代码运行后会生成长度不达标的末尾子向量,示例输出如下:
[1] 1 2 3 4 5 6 7 8
[2] 5 6 7 8 9 10 11 12
[3] 9 10 11 12 13 14 15 16
[4] 13 14 15 16 17
不符合使用要求,需要将最后一段长度为5的子向量合并到前一段中。
修正后可直接运行代码
########块拆分计算函数###################### blocks <- function(len, ov, n) { starts <- unique(sort(c(seq(1, n, len), seq(len-ov+1, n, len)))) ends <- pmin(starts + len - 1, n) # 截断到首次覆盖到向量末尾的位置 num <- match(n, ends) res <- head(data.frame(starts, ends), num) # 新增末尾短块合并逻辑 if(nrow(res) >= 2){ last_block_len <- res$ends[nrow(res)] - res$starts[nrow(res)] + 1 if(last_block_len < len){ res$ends[nrow(res)-1] <- n res <- res[-nrow(res), ] } } return(res) } ########测试调用############# vec = 1:17 len = 8 # 子向量设定长度 ov = ceiling(len/2) # 重叠长度,这里默认取子向量长度的一半向上取整 b <- blocks(len, ov, length(vec)) # 输出最终拆分结果 with(b, Map(function(i, j) vec[i:j], starts, ends))
运行输出结果
[1] 1 2 3 4 5 6 7 8
[2] 5 6 7 8 9 10 11 12
[3] 9 10 11 12 13 14 15 16 17
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

