如何在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
相关产品推荐
相关产品推荐

