在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稳定段)。
代码说明
rle(df$X1):将向量转换为游程结构,每个元素记录连续相同值的长度和对应值which(rle_result$lengths >=2)[-1]:筛选出长度≥2的稳定段,去掉第一个段(它是初始取值,没有变化过程)cumsum(rle_result$lengths)[valid_runs -1] +1:累加前序所有游程的长度,得到前一段的结束位置,加1就是当前稳定段的起始位置
内容的提问来源于stack exchange,提问作者AnonX
相关产品推荐
相关产品推荐

