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
相关产品推荐
相关产品推荐

