将时间间隔数据扩展为R中的天数

时间:2014-04-23 19:34:30

标签: r time-series

假设我的数据如下所示:

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中使用循环这样做。很确定这是不必要的。有没有像这样扩展时间间隔的套餐?看起来像一个重塑类型的工作,因为我把时间间隔转换为长格式数据集。

感谢。

3 个答案:

答案 0 :(得分:7)

这是数据表的一种方式(假设您的数据位于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

答案 1 :(得分:3)

旧学校(基地)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)))

})))

答案 2 :(得分:1)

以下是使用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值会在每一行中重复,但如果您愿意,可以删除它们。