2017-01-09 9 views
0

У меня есть большой продаж набор данных (> 1 М строк), которые содержат 2 колонки:частоты на основе уникального даты (альтернатива для цикла) R

  • client_id
  • PURCHASE_DATE

ID клиента часто повторяется.

Для каждой строки я хотел бы рассчитать «Сколько раз клиент покупал за последние 30 дней».

  • client_id
  • PURCHASE_DATE
  • Freq_Last_30_Days

В настоящее время, I цикл по каждой строке и сделать nrow() рассчитывать с использованием следующих критериев:

data$Client_ID == data$Client_ID[i] 
data$Purchase_Date < data$Purchase_Date[i] 
data$Purchase_Date >= data$Purchase_Date[i] - 30 

Учитывая размер базы данных, требуется больше времени. Есть ли более эффективный способ нахождения частоты без использования цикла for?

+1

поиск rollapply библиотеки зоопарка. – xosp7tom

+0

Кроме того, вы можете проверить [здесь] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – akrun

ответ

0

Вы можете использовать sapply вместо цикла for, но, вероятно, все еще медленно (но стоит попробовать). dplyrfilter будет немного быстрее, чем базовый R's [].

Например,

dfr <- data.frame(Client_ID = sample(letters[1:15], 100, replace=TRUE), 
       Date=seq.Date(as.Date("2016-11-1"), length=100, by="1 day")) 

row_fun <- function(i){ 
    subs <- dfr[dfr$Date > dfr$Date[i] - 30 & dfr$Date < dfr$Date[i],] 
    sum(subs$Client_ID == dfr$Client_ID[i]) 
} 
dfr$Freq_Last_30_Days <- sapply(1:nrow(dfr), row_fun) 

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

  • Нет связанных вопросов^_^