基于唯一日期的频率(替代for循环)R

时间:2017-01-09 02:05:00

标签: r loops date frequency

我有一个包含2列的大型销售数据集(> 1 M行):

  • CLIENT_ID
  • PURCHASE_DATE

客户ID经常重复。

对于每一行,我想计算"客户在过去30天内购买了多少次。"

  • CLIENT_ID
  • PURCHASE_DATE
  • Freq_Last_30_Days

目前,我循环遍历每一行并使用以下标准执行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 个答案:

答案 0 :(得分:0)

您可以使用sapply而不是for循环,但可能仍然很慢(但值得一试)。 dplyr&#39; filter也会比基本R []方法快一点。

例如,

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)