R语言如何提取数据框各列连续1值块的起止位置索引
R提取数据框中连续1值块的起止索引
问题场景
现有仅包含0、1、NA值的数据框,示例构造代码如下:
mydata <- data.frame(a = c(0,0,0,1,1,1,0,0,0,1,1,NA,NA,NA), b = c(0,0,1,1,1,1,0,0,1,1,0,NA,NA,NA))
需要针对数据框的每个变量,提取每一段连续1值块的起始索引与结束索引,期望输出结果如下:
# 期望输出 data.frame(a = c(4,6,10,11), b = c(3,6,9,10))
实现逻辑
- 逐列处理数据,先筛选出列中值等于1的所有位置索引,自动过滤0和NA值
- 通过相邻索引的差值判断连续块:如果两个相邻1的位置差大于1,说明属于两个不同的连续块
- 对每个识别到的连续块,取块内最小索引作为起始位置、最大索引作为结束位置,按「起始-结束」的顺序拼接
- 不同列的连续块数量可能不同,最终对短列的结果尾部填充NA,保证输出为规范数据框结构
完整可运行代码
# 构造示例数据 mydata <- data.frame( a = c(0,0,0,1,1,1,0,0,0,1,1,NA,NA,NA), b = c(0,0,1,1,1,1,0,0,1,1,0,NA,NA,NA) ) # 定义单列处理函数:提取连续1块的起止索引 get_block_index <- function(col) { one_pos <- which(col == 1) # 列中无1值时返回空向量 if (length(one_pos) == 0) return(numeric(0)) # 为连续的1值分组 block_id <- cumsum(c(TRUE, diff(one_pos) > 1)) # 按组拼接起止索引 unlist(lapply(split(one_pos, block_id), function(block) c(block[1], block[length(block)]))) } # 对所有列应用处理函数 col_res <- lapply(mydata, get_block_index) # 对齐所有列的长度,短列填充NA后转成数据框 max_len <- max(lengths(col_res)) final_res <- as.data.frame( lapply(col_res, function(x) c(x, rep(NA, max_len - length(x)))) )
结果验证
运行上述代码后输出的final_res和期望结果完全一致:
> final_res a b 1 4 3 2 6 6 3 10 9 4 11 10
内容的提问来源于stack exchange,提问作者Nicolas Cuenca Zaldivar
相关产品推荐
相关产品推荐

