如何在R语言中计算向量指定区间滚动最小值的距今天数?
解决方案:计算滚动区间最小值的距今时长
针对你需要计算每个交易日对应50-100天前区间内最小值的距今时长的需求,以下是基于data.table(适合百万级大数据)和dplyr(代码更简洁)的高效实现方案:
明确区间范围
你之前用TTR::runMin(dplyr::lag(v,51),50)计算的是距今51-100天的滚动最小值(共50个交易日的数据),我们的目标是对每个位置i,找到v[(i-100):(i-51)]中最小值对应的原始位置,再计算i - 原始位置得到距今天数。
方案1:data.table(百万级数据首选)
data.table的非等连接和分组操作在大数据场景下效率远高于基础R或dplyr,适合处理百万行级别的数据集:
library(data.table) # 构造带索引的数据集 dt <- data.table(day_id = 1:length(v), price = v) # 定义窗口参数:距今51-100天 lookback_min <- 51 lookback_max <- 100 # 为每个交易日计算窗口的起止索引 dt[, `:=`(window_start = day_id - lookback_max, window_end = day_id - lookback_min)] # 非等连接匹配窗口,找到每个窗口内价格最小的交易日索引 result <- dt[dt, on = .(day_id >= window_start, day_id <= window_end), .(current_day = i.day_id, min_day = day_id[which.min(price)]), by = .EACHI] # 合并回原表,计算距今天数 dt <- dt[result, on = .(day_id = current_day)][, days_ago := day_id - min_day]
最终dt$days_ago就是每个交易日对应的区间最小值距今时长,前100天因无足够历史数据会返回NA。
方案2:dplyr + slide(代码简洁)
如果更习惯dplyr的语法,可以结合slide包实现滑动窗口的最小值位置查找:
library(dplyr) library(slide) # 构造数据集 tb <- tibble(day_id = 1:length(v), price = v) # 定义窗口参数 lookback_min <- 51 lookback_max <- 100 # 滑动窗口计算最小值在窗口内的索引,再转换为距今天数 tb <- tb %>% mutate( # 取当前交易日往前100到51天的价格窗口,返回最小值在窗口内的位置(1-50) window_min_pos = slide_dbl( price, ~ which.min(.x), .window = c(-lookback_max, -lookback_min), .complete = TRUE # 仅返回窗口完整的结果,否则为NA ), # 转换为距今天数:窗口第1位对应100天前,第50位对应51天前 days_ago = lookback_max - (window_min_pos - 1) )
tb$days_ago即为所需结果,同样前100天返回NA。
效率说明
- 百万级数据集优先选择
data.table方案,其底层优化的连接和分组操作能大幅减少计算时间; - 若数据集规模较小,
dplyr + slide的代码可读性更高,开发效率更快。
内容的提问来源于stack exchange,提问作者RomanS
相关产品推荐
相关产品推荐

