You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言按连续长度条件查找向量1值并截取固定长度片段存入列表

R语言实现连续1序列定长截取方案

你已经完成rle()识别连续值的第一步,后续截取、边界填充、列表整合可以按以下逻辑实现,代码可直接运行得到你期望的输出:

核心实现逻辑

  • 基于rle()结果过滤出所有值为1、连续长度大于3的片段,计算每个片段的起止位置和中心索引
  • 固定输出片段长度为20,将每个连续1片段的中心对齐到输出片段的中点位置
  • 对超出原向量边界的截取位置自动用NA填充,保证所有输出片段长度一致
  • 按顺序将所有片段存入列表

完整实现代码

# 加载测试向量
dummy_vector <- c(1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
                  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)

# 识别所有符合要求的连续1片段
rle_result <- rle(dummy_vector)
valid_seg_loc <- which(rle_result$values == 1 & rle_result$lengths > 3)

# 计算每个有效片段的起止位置、中心位置
seg_info <- data.frame(
  seg_start = cumsum(c(1, rle_result$lengths[-length(rle_result$lengths)]))[valid_seg_loc],
  seg_end = cumsum(rle_result$lengths)[valid_seg_loc]
)
seg_info$center <- floor((seg_info$seg_start + seg_info$seg_end) / 2)

# 循环截取定长片段
output_list <- list()
for (i in seq_len(nrow(seg_info))) {
  current_cen <- seg_info$center[i]
  # 计算目标截取的左右边界,保证最终片段长度为20
  target_left <- current_cen - 9
  target_right <- current_cen + 10
  # 初始化片段,默认填充NA
  current_seg <- rep(NA, 20)
  # 计算原向量中实际可截取的范围
  real_left <- max(target_left, 1)
  real_right <- min(target_right, length(dummy_vector))
  # 映射到输出片段的对应位置
  fill_start <- real_left - target_left + 1
  fill_end <- fill_start + (real_right - real_left)
  # 赋值有效内容
  current_seg[fill_start:fill_end] <- dummy_vector[real_left:real_right]
  output_list[[i]] <- current_seg
}

# 按期望格式命名
names(output_list) <- c("first", "second")

结果验证

运行代码后得到的output_list和你给出的期望输出完全一致:

  • output_list$first:c(NA,NA,NA,NA,NA,NA,NA,NA,1,1,1,1,0,0,0,0,0,0,0,0)
  • output_list$second:c(0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0)

可调整说明

  • 代码自动兼容右侧边界不足的场景,当连续1片段靠近向量末尾时,超出范围的位置会自动填充NA
  • 如果需要调整对齐偏移,只需修改center的计算逻辑(比如将floor替换为ceiling)
  • 如果需要调整片段总长度,同步修改target_left、target_right的偏移值和current_seg的初始化长度即可

内容的提问来源于stack exchange,提问作者Euglenagracilis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 08:15:34