迭代拆分与索引:R语言向量拆分后区间的称呼问题
关于向量分块的那些事儿
先回答你的核心问题:拆分后的区间叫啥?
这些拆分出来的连续区间,在编程(尤其是R语言的语境里)最常用的称呼是chunks(块),也有人叫segments(段)或者subvectors(子向量)。不过"chunks"是这类分块操作里最通用的说法,很多R包的文档里都这么用,大家一看就懂。
再说说你的分块函数问题
你写的那个chunk函数其实没实现你想要的"连续区间拆分"——它会把向量按奇偶位置拆(比如n=2时,拿的是所有奇数位和偶数位的元素),而不是连续的前半段后半段。我给你调整两个更贴合需求的版本:
版本1:优先保证前面的块长度一致(适合大部分场景)
这个版本会让前几个块长度相同,最后一个块可能短一点:
chunk <- function(x, n) { # 算出每个块的基准长度 chunk_size <- ceiling(length(x) / n) # 给每个元素分配分组编号 groups <- cut(seq_along(x), breaks = n, labels = FALSE) # 按组拆分向量 split(x, groups) }
测试一下:
s <- c(1:25) chunk(s, 2) # 结果是两个连续块:1-13 和 14-25
版本2:尽量让所有块长度均匀
如果想让块的长度差不超过1(比如25拆成2块的话,12和13个元素),可以用这个:
chunk_even <- function(x, n) { len <- length(x) # 计算拆分点 splits <- seq(1, len + 1, by = ceiling(len / n)) # 逐个提取每个块 lapply(seq_len(n), function(i) { start <- splits[i] end <- min(splits[i+1] - 1, len) x[start:end] }) }
运行chunk_even(s,2)就会得到1-12和13-25这两个块。
要是你常用purrr包,直接用purrr::chunk_split()也能搞定,代码更简洁。
为啥你的原函数不对?
你的原函数里sort(rank(x) %% n)这一步,会把向量元素的位置按取余结果排序,导致拆分出来的是分散的元素,不是连续的区间。比如n=2时,rank(x)是1到25,取余后是1、0、1、0...排序后所有0排一起,1排一起,所以split出来的是偶数位和奇数位的元素,这和你想要的连续区间拆分完全不是一回事~
内容的提问来源于stack exchange,提问作者Manuja Kothiyal
相关产品推荐
相关产品推荐

