Значение лага с датами - PullRequest
0 голосов
/ 04 марта 2019

Я изучаю цену товара по времени.У меня есть ежедневные данные с некоторой случайной отсутствующей информацией.

См. Здесь минимальный пример, где отсутствует информация за 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, если потребуется

Ответы [ 3 ]

0 голосов
/ 04 марта 2019

Вы можете расширить даты и затем 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)
0 голосов
/ 04 марта 2019
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

Используется таблица с (timeStamp + 1, price) для обновления соединения.

0 голосов
/ 04 марта 2019

Вы можете добавить оператор 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
...