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

从一阶差分向量中提取连续递增与递减序列

刚好做过类似的需求,我来一步步帮你实现!首先咱们先把模拟数据搞出来,再用R的工具来提取连续递增/递减的序列——不管你要的是差分序列本身的连续增减,还是对应原序列连续增减的差分段,都能搞定~

第一步:生成模拟数据

先造一个带NA的一阶差分向量,完美模拟你的真实场景:

set.seed(456) # 设随机种子,保证结果可重复
v <- c(NA, 0.2, 0.5, -0.1, -0.3, NA, 0.1, 0.3, 0.4, NA, -0.2, -0.5, -0.1, NA)

这个向量里有NA分隔的多个差分片段,包含连续正、连续负的部分,和你描述的2718条观测的结构一致。

第二步:提取差分序列本身的连续递增/递减段

如果你的需求是找出v自身的连续递增(后一个元素比前一个大)或递减(后一个比前一个小)子序列,可以用dplyr配合rle(游程编码)来处理:

library(dplyr)

# 1. 把非NA元素按NA分隔成不同块,标记每个元素的所属块
block_ids <- cumsum(is.na(v))
non_na_df <- data.frame(value = v[!is.na(v)], block = block_ids[!is.na(v)])

# 2. 对每个块判断元素间趋势,标记连续相同趋势的段
result_df <- non_na_df %>%
  group_by(block) %>%
  mutate(
    # 计算当前元素与前一个的趋势:1=递增,-1=递减,0=相等
    trend = sign(diff(c(NA, value))),
    # 用累积和标记连续相同趋势的段ID
    segment_id = cumsum(c(1, diff(trend) != 0))
  ) %>%
  # 只保留纯递增或纯递减的段(过滤掉有波动的段)
  group_by(block, segment_id) %>%
  filter(all(trend == 1) | all(trend == -1)) %>%
  ungroup() %>%
  # 添加可读性标签
  mutate(trend_label = case_when(
    trend == 1 ~ "连续递增",
    trend == -1 ~ "连续递减"
  )) %>%
  select(value, trend_label)

# 查看最终结果
print(result_df)

运行后会得到所有符合要求的子序列,并且清晰标记了递增/递减类型。

第三步:提取对应原序列连续增减的差分段

如果你的需求是找原序列连续递增/递减对应的差分片段(也就是差分序列中连续为正/负的部分),用rle直接处理更高效:

提取原序列连续递增的差分段(差分连续为正)

# 对v的正负性做游程编码
positive_runs <- rle(v > 0)
# 筛选出连续为正的段(可以调整lengths >= 2,只保留至少2个连续正差分的段)
valid_pos_runs <- which(positive_runs$values & positive_runs$lengths >= 1)

# 计算每个有效段的起始和结束位置
start_pos <- c(1, cumsum(positive_runs$lengths)[-length(positive_runs$lengths)] + 1)
end_pos <- cumsum(positive_runs$lengths)

# 输出结果
cat("原序列连续递增对应的差分片段:\n")
for (i in valid_pos_runs) {
  cat("段", i, ":", v[start_pos[i]:end_pos[i]], "\n")
}

提取原序列连续递减的差分段(差分连续为负)

negative_runs <- rle(v < 0)
valid_neg_runs <- which(negative_runs$values & negative_runs$lengths >= 1)

start_pos_neg <- c(1, cumsum(negative_runs$lengths)[-length(negative_runs$lengths)] + 1)
end_pos_neg <- cumsum(negative_runs$lengths)

cat("\n原序列连续递减对应的差分片段:\n")
for (i in valid_neg_runs) {
  cat("段", i, ":", v[start_pos_neg[i]:end_pos_neg[i]], "\n")
}

对于你2718条观测的大数据量,base R的rle方法运行速度更快,推荐优先使用~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:00:26