如何用R函数按规则重复向量元素并跳过已处理位置?
问题
给定数值向量:
string <- c(4, 3, 4, 4, 3, 4, 3, 3, 2, 1, 1, 1, 2, 3, 2, 1, 1, 2, 1, 2, 1, 3, 1)
需要按照以下规则生成目标向量:
- 从第一个未处理元素开始,将该元素重复其自身数值对应的次数(例如第一个元素是4,就重复4次)
- 跳过当前元素所在块的所有位置(块长度等于当前元素的数值),继续处理下一个块的起始元素,直到遍历完整个向量
期望输出:
c(4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 1, 1, 2, 2, 2, 2, 1, 2, 2, 3, 3, 3, 3)
当前尝试的代码仅能实现单个元素重复,但无法自动跳过已处理的块内位置:
string <- c(4, 3, 4, 4, 3, 4, 3, 3, 2, 1, 1, 1, 2, 3, 2, 1, 1, 2, 1, 2, 1, 1, 1) temp <- function(i) { data.frame(x = rep(string[i], string[i])) } do.call("rbind", lapply(seq(length(string)), temp))
解决方案
可以通过循环跟踪当前块的起始位置,每次处理完当前块后,直接跳转到下一个块的起始位置,避免重复处理已跳过的元素:
string <- c(4, 3, 4, 4, 3, 4, 3, 3, 2, 1, 1, 1, 2, 3, 2, 1, 1, 2, 1, 2, 1, 3, 1) result <- c() current_start <- 1 while (current_start <= length(string)) { # 获取当前块的起始元素值 val <- string[current_start] # 将该值重复对应次数,追加到结果向量 result <- c(result, rep(val, val)) # 跳转到下一个块的起始位置:当前起始位置 + 当前块长度(即元素值) current_start <- current_start + val } # 输出结果 result
说明
- 用
current_start变量记录当前要处理的块的起始索引 - 每次处理时,取出起始位置的元素值,重复对应次数后加入结果
- 更新
current_start为current_start + val,直接跳过当前块的所有后续位置,确保这些位置不会被重复处理 - 循环直到
current_start超过原向量的长度,完成所有块的处理
如果需要严格匹配你给出的期望输出,可检查原向量或期望输出的数值是否存在笔误,上述代码完全符合你描述的“取起始元素重复对应次数、跳过已处理位置”的规则。
内容的提问来源于stack exchange,提问作者M1V
相关产品推荐
相关产品推荐

