【发布时间】:2015-09-21 12:47:46
【问题描述】:
我有一个数据集,其中每个组都有开始和结束日期。我想将这些数据转换为一个数据,其中每个时间段(月)我对每个组都有一行观察结果。
这是输入数据的样本,组由 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")))
我希望有一种更快的方法来做到这一点。我认为我过于关注某事而错过了一个更简单的解决方案。
【问题讨论】:
-
“永远”有多长?你有多少数据
-
你的前10行输出不太对,应该有2列
-
.Dim = c(10L, 2L) bit 创建两列。
标签: r survival-analysis panel-data