【问题标题】:Expand time interval data into days in R将时间间隔数据扩展到 R 中的天数
【发布时间】:2014-04-23 19:34:30
【问题描述】:

假设我有如下数据:

interval_id indiv_id   role start_date   end_date
          1        1      A 2006-05-01 2006-06-16
          2        1      B 2006-06-16 2006-10-16
          3        1      A 2006-10-16 2009-10-16
          4        1      B 2009-10-16 2014-04-23
          5        2      A 2007-12-15 2009-10-16
          6        2      B 2009-10-16 2011-07-01

但是我想要这样的数据(以第一个角色区间为例):

interval_id indiv_id   role        day
          1        1      A 2006-05-01
          1        1      A 2006-05-02
          1        1      A 2006-05-03
          1        1      A 2006-05-04
          1        1      A 2006-05-05
          1        1      A 2006-05-06
        ...      ...    ...        ...
          1        1      A 2006-06-16

我在 R 中使用循环来执行此操作。很确定这是不必要的。有没有像这样扩展时间间隔的包?看起来像是一个重塑类型的工作,因为我有点将时间间隔变成一个长格式的数据集。

谢谢。

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    这是一种使用数据表的方法(假设您的数据在 df 中)。

    library(data.table)
    dt <- data.table(df)
    dt <- dt[,seq(as.Date(start_date),as.Date(end_date),by=1),
              by=list(interval_id,indiv_id,role)]
    setnames(dt,"V1","day")
    head(dt)
    #    interval_id indiv_id role        day
    # 1:           1        1    A 2006-05-01
    # 2:           1        1    A 2006-05-02
    # 3:           1        1    A 2006-05-03
    # 4:           1        1    A 2006-05-04
    # 5:           1        1    A 2006-05-05
    # 6:           1        1    A 2006-05-06
    

    【讨论】:

      【解决方案2】:

      老派(基地)R:

      new.dat <- do.call("rbind", as.list(by(dat, dat[,1:3], function(x) {
      
        return(data.frame(interval_id=x$interval_id, 
                          ndiv_id=x$indiv_id, 
                          role=x$role, 
                          day=seq(as.Date(x$start_date), as.Date(x$end_date), by=1)))
      
      })))
      

      【讨论】:

        【解决方案3】:

        这是使用plyr 的一种方法(再次假设您的数据在df 中):

        library(plyr)
        byDay = ddply(df, .(interval_id, indiv_id, role), transform, 
                      day=seq(as.Date(start_date), as.Date(end_date), by=1))
        

        start_date 和 end_date 值在每一行中重复,但您可以根据需要删除它们。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-08-15
          • 1970-01-01
          • 2012-05-15
          • 1970-01-01
          • 1970-01-01
          • 2015-07-18
          相关资源
          最近更新 更多