滞后值与日期
Lag value with dates
我正在研究一个产品的价格。我每天都有随机丢失一些信息的数据。
请参阅此处的最小示例,其中缺少 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
、dplyr
和 tidyverse
您可以添加一个 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
您可以展开日期,然后 lag
价格。在此策略中,您还可以选择在管道中引入过滤器以删除不需要的日期。
data.frame(timeStamp = seq(min(mockData$timeStamp), max(mockData$timeStamp), by = 1)) %>%
# you could add a further filter in here to clean out dates you don't want
left_join(., mockData, by = "timeStamp") %>%
mutate(lag_price = lag(price)) %>%
filter(!is.na(all_dates)) %>%
select(-all_dates)
mockData[, v :=
data.table(timeStamp = timeStamp + 1, price)[.SD, on=.(timeStamp), x.price]
]
timeStamp price v
1: 2018-01-01 10 NA
2: 2018-01-02 15 10
3: 2018-01-03 12 15
4: 2018-01-05 11 NA
这使用 table 和 (timeStamp + 1, price)
进行更新连接。
我正在研究一个产品的价格。我每天都有随机丢失一些信息的数据。
请参阅此处的最小示例,其中缺少 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
、dplyr
和 tidyverse
您可以添加一个 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
您可以展开日期,然后 lag
价格。在此策略中,您还可以选择在管道中引入过滤器以删除不需要的日期。
data.frame(timeStamp = seq(min(mockData$timeStamp), max(mockData$timeStamp), by = 1)) %>%
# you could add a further filter in here to clean out dates you don't want
left_join(., mockData, by = "timeStamp") %>%
mutate(lag_price = lag(price)) %>%
filter(!is.na(all_dates)) %>%
select(-all_dates)
mockData[, v :=
data.table(timeStamp = timeStamp + 1, price)[.SD, on=.(timeStamp), x.price]
]
timeStamp price v
1: 2018-01-01 10 NA
2: 2018-01-02 15 10
3: 2018-01-03 12 15
4: 2018-01-05 11 NA
这使用 table 和 (timeStamp + 1, price)
进行更新连接。