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).
Затем присоедините к этому свой старый фрейм данных и используйте функцию запаздывания окон (нужно сделать дважды).
Надеюсь, это немного поможет.