我有一个数据框:
a <- data.frame(BEG_D=as.Date(c("2014-01-01","2014-01-01","2014-01-01","2014-01-01","2014-01-01","2014-01-01","2014-01-01","2014-01-08")) , day=c("Mon","Tues","Wed","Thurs","Fri","Satur","Sun","Mon"), WkNo=c(1,1,1,1,1,1,1,2))
此处BEG_D代表星期的开始日期(“2014-01-01”为星期日)。为了生成其余的日期数字。我编写了一个自定义函数并将其与ddply一起使用:
date_generator <- function(f){
f$seq <- seq(nrow(f))-1
f$date <- as.Date(f$BEG_D + f$seq)
return(f)
}
b <- ddply(a,.(WkNo),date_generator)
这在新数据框中的效果很好,我有:
seq = c(0,1,2,3,4,5,6,0)
date = c("2014-01-01","2014-01-02","2014-01-03","2014-01-04","2014-01-05","2014-01-06","2014-01-07","2014-01-08")
但是我的大数据框需要很长时间。除此之外,还有更多的ddply操作需要很长时间。所以我决定使用data.table和相同的数据。
date_generator <- function(f){
f[,seq := seq(nrow(f))-1]
f[,.(date = as.Date(BEG_D + seq))]
return(f)
}
a[,date_generator(.SD),by=.(WkNo)]
这样做会引发错误:
[.data.table(f ,,:=(seq,seq(nrow(f)) - 1))中的错误:.SD被锁定。 使用:= in .SD的j保留供将来使用;一个曲折的 灵活的方式来按组修改。使用:=在j中直接修改 小组参考。
用data.table编写这个自定义函数的正确方法是什么?为什么ddply对于大数据帧来说这么慢?
答案 0 :(得分:4)
以下是在data.table中执行此操作的标准方法:
a[, date := BEG_D + 1:.N - 1, by=WkNo]
变量.N
存储nrow(.SD)
组的大小by
。我建议看一下这个包的优秀introductory materials,以了解它的习语。