具有data.table的自定义功能

时间:2015-09-14 18:18:33

标签: r data.table

我有一个数据框:

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对于大数据帧来说这么慢?

1 个答案:

答案 0 :(得分:4)

以下是在data.table中执行此操作的标准方法:

a[, date := BEG_D + 1:.N - 1, by=WkNo]

变量.N存储nrow(.SD)组的大小by。我建议看一下这个包的优秀introductory materials,以了解它的习语。