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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:06:23