如何在时间序列中按指定月份数固定数值(基于二进制标记)
实现基于二进制标记的时间序列数值固定函数
需求说明
需要构建函数,在时间序列数据中,当二进制列buy标记为1时,将对应prc值在当前行及后续指定行数(月份数)内保持恒定。示例数据中的htm_prc列展示了预期结果(每个buy=1的行,保持当前值及后续1行)。
函数实现
基于需求,直接构建目标函数fix_prc_until,逻辑为定位所有buy=1的触发点,为每个触发点设置覆盖范围并替换对应位置的数值:
fix_prc_until = function(prc, buy, n) { # 初始化结果向量,保留原始prc值 result <- prc # 获取所有buy标记为1的行索引 trigger_pos <- which(buy == 1) # 遍历每个触发点,设置数值固定范围 for(pos in trigger_pos) { # 计算覆盖的结束位置,避免超出数据长度 end_pos <- min(pos + n, length(prc)) # 将触发点到结束位置的prc值替换为触发点的数值 result[pos:end_pos] <- prc[pos] } return(result) }
测试验证
使用提供的示例数据测试函数,设置n=1(对应示例中保持1个后续月份):
# 示例数据 htm <- data.frame ( Date = c("Jan 2001", "Feb 2001", "Mar 2001", "Apr 2001", "May 2001", "Jun 2001", "Jul 2001", "Aug 2001", "Aug 2001"), prc = c(34,35,38,24,22,18,30,32,38), buy = c(1, 1, 1, 0, 0, 1, 0, 0, 0), htm_prc = c(34,34,38,38,22,18,18,32,38) ) # 生成测试结果 htm$test_prc <- fix_prc_until(htm$prc, htm$buy, n=1) # 对比预期与测试结果 print(htm[, c("Date", "prc", "buy", "htm_prc", "test_prc")])
输出结果中test_prc与htm_prc完全一致,符合预期。
扩展说明
- 参数
n可按需调整,比如设置n=2时,每个buy=1的行将保持当前值及后续2行 - 若存在触发点覆盖范围重叠的情况,后出现的
buy=1会覆盖之前的固定值,符合时间序列中最新标记优先的逻辑
内容的提问来源于stack exchange,提问作者Freddy Müller
相关产品推荐
相关产品推荐

