我有一个包含2列的大型销售数据集(> 1 M行):
客户ID经常重复。
对于每一行,我想计算"客户在过去30天内购买了多少次。"
目前,我循环遍历每一行并使用以下标准执行nrow()计数:
data$Client_ID == data$Client_ID[i]
data$Purchase_Date < data$Purchase_Date[i]
data$Purchase_Date >= data$Purchase_Date[i] - 30
考虑到数据库大小,这需要花费数小时的时间。有没有一种更有效的方法来查找频率而不使用for循环?
答案 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)