2017-01-09 9 views
0

I 2列を含む大きな売上データセット(> 1 M行)を有する:固有の日付に基づいて、周波数(forループの代わり)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

検索。 – xosp7tom

+0

また、[ここ](http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)をチェックすることもできます。 – akrun

答えて

0

forループの代わりにsapplyを使用できますが、おそらくまだ遅いですが(試してみる価値があります)。 dplyrfilterは、ベースRの[]メソッドよりも少し速くなります。例えば

、動物園のライブラリーのrollapplyため

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) 
関連する問題