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

如何在R中根据value列条件处理时间序列的滞后收益率?

问题:基于滞后收益率的NA值替换需求(适配任意LAG)

原始数据与当前实现

首先构造目标数据框:

library(tidyverse)
LAG = 2 
date = seq(as.Date("2022/1/1"), as.Date("2022/1/10"), by = "day")
close = c(1.02,1.01,0.992,1.01,1.01,0.993,0.98,1.02,1.02,0.994)
value = c(2,3,2,2,0,3,4,3,0,9)*1000000
df = tibble(date,close,value)

当前仅能处理当前日期value为0的代码:

df %>%
  dplyr::mutate(y = as.numeric(close/ (dplyr::lag(close, LAG))-1))

需求说明

需要将y列(LAG日滞后收益率)中满足以下任一条件的值设为NA:

  • 计算该收益率的当前日期对应的value为0
  • 计算该收益率的**起始日期(当前日期往前推LAG天)**对应的value为0
    且逻辑需适配任意LAG值(如3、5天)

解决方案

通过同时检查当前行与滞后LAG行的value值,实现NA替换:

方法1:使用ifelse

df %>%
  mutate(
    # 计算原始滞后收益率
    y = close / lag(close, LAG) - 1,
    # 满足任一条件则设为NA
    y = ifelse(value == 0 | lag(value, LAG) == 0, NA_real_, y)
  )

方法2:使用case_when

df %>%
  mutate(
    y = close / lag(close, LAG) - 1,
    y = case_when(
      value == 0 | lag(value, LAG) == 0 ~ NA_real_,
      TRUE ~ y
    )
  )

验证结果

运行上述代码后,输出与期望完全一致:

# A tibble: 10 × 4
   date       close   value       y
   <date>     <dbl>   <dbl>   <dbl>
 1 2022-01-01 1.02  2000000 NA     
 2 2022-01-02 1.01  3000000 NA     
 3 2022-01-03 0.992 2000000 -0.0275
 4 2022-01-04 1.01  2000000  0     
 5 2022-01-05 1.01        0  NA
 6 2022-01-06 0.993 3000000 -0.0168
 7 2022-01-07 0.98  4000000  NA
 8 2022-01-08 1.02  3000000  0.0272
 9 2022-01-09 1.02        0  NA
10 2022-01-10 0.994 9000000 -0.0255

内容的提问来源于stack exchange,提问作者Homer Jay Simpson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 01:55:18