或者更确切地说,我怎样才能做得比我捏造的更好。
我有一个数据框,其中包含一组名称以及开始和结束日期。我想生成一个数据框,其中包含随着时间的推移组中的人数。注意,有些人还没有离开(结束日期为 NA)
这是一个示例数据集
foo<-data.frame(name=c("Bob","Sue", "Richard", "Jane"),
Start=as.POSIXct(c("2006-03-23 GMT", "2007-01-20 GMT", "2007-01-20 GMT", "2006-03-23 GMT")),
End=as.POSIXct(c("2009-01-20 GMT", "NA", "2006-03-23 GMT", "NA")))
在这里,我创建了一个数据框,其日期涵盖了我想要的范围。这感觉很脏。
daterange<-data.frame(date=as.POSIXct(
paste(
rep(2006:2009, each=12),
"-",
rep(01:12, times=4),
"-",
1,
" GMT",
sep="")
)
)
#cheat by setting NAs to soemthing far away
foo$End[is.na(foo$End)]<-as.POSIXct(Sys.time())+(365*24*60*60)
现在我使用 ddply 来产生结果。
ddply(.data=daterange, .variable="date", function(df) {
result=nrow(subset(foo, Start<df$date & End>df$date))
return(result)
})
一定有更简单的方法吗?