У меня есть кадр данных:Пользовательская функция с 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)]
Doing так бросил ошибку:
Error in [.data.table(f, , :=(seq, seq(nrow(f)) - 1)) : .SD is locked. Using := in .SD's j is reserved for possible future use; a tortuously flexible way to modify by group. Use := in j directly to modify by group by reference.
Что такое правильный способ, чтобы написать эту пользовательскую функцию с data.table и почему ddply так медленно для большого кадра данных?
Я думаю, что вы ищете 'a [, newdate: = BEG_D + 1: .N - 1, by = WkNo]' (я не использую plyr и поэтому не могу сравнивать.) – Frank
Спасибо @Frank ..Indeed это отлично работает для случая таблицы данных ... У вас недостаточно репутации, как ваш ответ, хотя :( – abhiieor