首页 > 解决方案 > 日期的滞后值

问题描述

我一直在研究产品的价格。我有一些随机缺失的每日数据。

请参阅此处的一个最小示例,其中缺少 1 月 4 日的信息:

library(lubridate)
library(data.table)

mockData <- data.table(timeStamp=c(ymd("20180101"), ymd("20180102"), ymd("20180103"), ymd("20180105")),
                       price=c(10,15,12,11))

我想将滞后价格添加到我的data.table但如果缺少前一天,我想要一个NA而不是最近的一天有信息。

我自己解释:

如果我使用该shift功能:

mockData[, lag_price:=shift(price,type="lag")]

我得到:

structure(list(timeStamp = structure(c(17532, 17533, 17534, 17536
), class = "Date"), price = c(10, 15, 12, 11), lag_price = c(NA, 
                                                             10, 15, 12)), row.names = c(NA, -4L), class = c("data.table", 
                                                                                                             "data.frame"))

但我真正想要的是:

structure(list(timeStamp = structure(c(17532, 17533, 17534, 17536
), class = "Date"), price = c(10, 15, 12, 11), lag_price = c(NA, 
                                                             10, 15, NA)), row.names = c(NA, -4L), class = c("data.table", 
                                                                                                             "data.frame"))

我觉得使用起来更舒服,但data.table我会使用data.frame,如果需要的话dplyrtidyverse

标签: rdata.tablelag

解决方案


您可以添加一个ifelse语句来检查连续天数

mockData[, lag_price := ifelse(timeStamp - shift(timeStamp) == 1, shift(price), NA)]
#    timeStamp price lag_price
#1: 2018-01-01    10        NA
#2: 2018-01-02    15        10
#3: 2018-01-03    12        15
#4: 2018-01-05    11        NA

推荐阅读