从一阶差分向量中提取连续递增与递减序列
刚好做过类似的需求,我来一步步帮你实现!首先咱们先把模拟数据搞出来,再用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
相关产品推荐
相关产品推荐

