2015-09-14 3 views
1

У меня есть кадр данных:Пользовательская функция с 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 так медленно для большого кадра данных?

+1

Я думаю, что вы ищете 'a [, newdate: = BEG_D + 1: .N - 1, by = WkNo]' (я не использую plyr и поэтому не могу сравнивать.) – Frank

+1

Спасибо @Frank ..Indeed это отлично работает для случая таблицы данных ... У вас недостаточно репутации, как ваш ответ, хотя :( – abhiieor

ответ

4

Вот стандартный способ сделать это в data.table:

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

Переменная .N хранит nrow(.SD), размер by группы. Я бы порекомендовал взглянуть на отличный introductory materials для пакета, чтобы понять его идиомы.

+0

@RYoda Потому что вопрос помечен data.table и довольно четко относится к нему, я не думаю 'library (data.table)'. И я не поклонник воспроизведения кода примера OPs в моем ответе. Если вы хотите сделать их согласованными, возможно, отредактируйте код OP (который должен создать data.table). – Frank

Смежные вопросы