簡體   English   中英

使用data.table的自定義功能

[英]Custom function with 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")

但是對於我的大數據幀來說需要很長時間。 除此之外,還有一些其他的耗時較長的操作。 因此,我決定將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已鎖定。 在.SD的j中使用:=保留以備將來使用; 一種按組靈活修改的曲折方式。 在j中直接使用:=可以按引用進行修改。

用data.table編寫此自定義函數的正確方法是什么,為什么大數據幀的ddply這么慢?

這是在data.table中執行此操作的標准方法:

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

變量.N存儲nrow(.SD) by組的大小nrow(.SD) 我建議您查看包裝的出色介紹材料 ,以了解其成語。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM