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

在R语言中检测向量中的实质性变化位置

检测向量中实质性变化的位置

数据加载

先加载你的目标数据:

df <- structure(list(ID = 1:41, X1 = c(1921498, 2519663, 2519663, 107388, 
2519663, 52211, 2519663, 62831, 62831, 62831, 62831, 62831, 62831, 
62831, 4225203351, 4225203351, 4225203351, 4225203351, 4225203351, 
4225203351, 4225203351, 171231, 171231, 171231, 183111, 171231, 
190461, 190461, 190461, 190461, 190461, 190461, 183041, 190461, 
191151, 210321, 210321, 210321, 210321, 211051, 211051)), class = "data.frame", row.names = c(NA, 
-41L))

核心逻辑

区分实质性变化和短暂波动的关键:

  • 短暂波动:取值仅出现1次,随后立刻回到之前的稳定值(比如行4、6、25这类情况)
  • 实质性变化:取值连续出现多次,形成新的稳定取值段(比如行8、15这类开启新连续值的位置)

R代码实现

利用rle()(游程编码)识别连续相同取值的段,过滤掉短长度的波动段,最终提取实质性变化的起始位置:

# 对X1列做游程编码,得到连续值的长度和对应值
rle_result <- rle(df$X1)

# 筛选出长度≥2的稳定段,排除第一个段(初始值无前置变化)
valid_runs <- which(rle_result$lengths >= 2)[-1]

# 计算每个稳定段的起始位置:累加前序游程长度后+1
change_positions <- cumsum(rle_result$lengths)[valid_runs - 1] + 1

# 输出结果
change_positions

结果验证

运行代码后得到的结果为:

[1]  8 15 22 27 36 40

完全匹配你提到的实质性变化位置:行8(进入62831稳定段)、行15(进入4225203351稳定段)、行22(进入171231稳定段)、行27(进入190461稳定段)、行36(进入210321稳定段)、行40(进入211051稳定段)。

代码说明

  1. rle(df$X1):将向量转换为游程结构,每个元素记录连续相同值的长度和对应值
  2. which(rle_result$lengths >=2)[-1]:筛选出长度≥2的稳定段,去掉第一个段(它是初始取值,没有变化过程)
  3. cumsum(rle_result$lengths)[valid_runs -1] +1:累加前序所有游程的长度,得到前一段的结束位置,加1就是当前稳定段的起始位置

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:40:24