我有一个数据集,每个组都有一个开始和结束日期。我想将这些数据转换为每个时间段(月)我对每个组进行一行观察的数据。
这是输入数据的示例,组由 id 标识:
structure(list(id = c(723654, 885618, 269861, 1383642, 250276,
815511, 1506680, 1567855, 667345, 795731), startdate = c("2008-06-29",
"2008-12-01", "2006-09-27", "2010-02-03", "2006-08-31", "2008-09-10",
"2010-04-11", "2010-05-15", "2008-04-12", "2008-08-28"), enddate = c("2008-08-13",
"2009-02-08", "2007-10-12", "2010-09-09", "2007-06-30", "2010-04-27",
"2010-04-13", "2010-05-16", "2010-04-20", "2010-03-09")), .Names = c("id",
"startdate", "enddate"), class = "data.frame", row.names = c("1",
"2", "3", "4", "6", "7", "8", "9", "10", "11"))
我写了一个函数并将其向量化。该函数采用存储在每行中的三个参数并生成具有组标识符的时间序列。
genDateRange<-function(start, end, id){
dates<-seq(as.Date(start), as.Date(end), by="month")
return( cbind(month=as.character(dates), id=rep(id, length(dates))))
}
genDataRange<-Vectorize(genDateRange)
我按如下方式运行该函数以获取数据框。我在输出中有超过 6M 行,所以它需要很长时间。我需要一个更快的方法。
range<-do.call(rbind,genDataRange(dat$startdate, dat$enddate, dat$id))
前十行输出如下所示:
structure(c("2008-06-29", "2008-07-29", "2008-12-01", "2009-01-01",
"2009-02-01", "2006-09-27", "2006-10-27", "2006-11-27", "2006-12-27",
"2007-01-27", "723654", "723654", "885618", "885618", "885618",
"269861", "269861", "269861", "269861", "269861"), .Dim = c(10L,
2L), .Dimnames = list(NULL, c("month", "id")))
我将不胜感激一种更快的方法来做到这一点。我认为我过于关注某件事而错过了一个更简单的解决方案。