Вменение временных рядов через dplyr - PullRequest
0 голосов
/ 30 августа 2018

Данный набор данных:

Category         Date    a    b  
      aa   2017-01-01    5    1
      aa   2017-01-03    1    3
      bb   2017-01-01    2    4
      bb   2017-01-02    3    5
      bb   2017-01-03    2    3
      cc   2017-01-03    3    3
     ... 

Мне нужно вменять наблюдения для каждой категории в данном наборе данных. Для столбца a мне нужно вменять 0, а для b - последнее наблюдаемое значение. Для этого примера я должен получить это:

 Category         Date    a    b  
       aa   2017-01-01    5    1
       aa   2017-01-02    0    1
       aa   2017-01-03    1    3
       bb   2017-01-01    2    4
       bb   2017-01-02    3    5
       bb   2017-01-03    2    3
       cc   2017-01-01    0    0   # start date for cc category, so '0'        
       cc   2017-01-02    0    0
       cc   2017-01-03    3    3
     ... 

1 Ответ

0 голосов
/ 30 августа 2018
library(dplyr)
library(lubridate)

df1 <- data.frame(
  Category = sort(rep(paste0(letters[seq( from = 1, to = 3 )], letters[seq( from = 1, to = 3 )]),3)),
  Date = rep(seq(as.Date("2017-01-01"), as.Date("2017-01-03"), by = "day"),3)
  )

df2 <- data.frame(Category = c("aa", "aa", "bb", "bb", "bb", "cc"),
           Date = c("2017-01-01","2017-01-03","2017-01-01","2017-01-02", "2017-01-03", "2017-01-03"),
           a = c(5, 1, 2, 3, 2, 3),
           b = c(1, 3, 4, 5, 3, 3)
           )
df2$Date = as.Date(df2$Date)

left_join(df1, df2) %>%
  group_by(Category) %>%
  mutate(a = ifelse(is.na(a), 0, a),
         b = ifelse(is.na(b), dplyr::lag(b,n=1,default=0),b),
         b = ifelse(is.na(b), dplyr::lag(b,n=1,default=0),b))

Ни в коем случае это не элегантное решение, но вы можете создать отдельный фрейм данных со всеми строками, которые вы хотите получить (просто используйте rep и seq).

Затем присоедините к этому свой старый фрейм данных и используйте функцию запаздывания окон (нужно сделать дважды).

Надеюсь, это немного поможет.

...