首页 文章

通过dplyr计算时间序列

提问于
浏览
-1

给定数据集:

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 回答

  • 1
    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) .

    然后将您的旧数据帧加入到此并使用滞后窗口功能(需要完成两次) .

    希望有所帮助 .

相关问题