【问题标题】:Frequency based on unique date (alternative to a for loop) R基于唯一日期的频率(替代 for 循环)R
【发布时间】:2017-05-23 05:46:48
【问题描述】:

我有一个包含 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 循环?

【问题讨论】:

  • 搜索动物园图书馆的rollapply。
  • 另外,您可以查看here

标签: r loops date frequency


【解决方案1】:

您可以使用sapply 代替 for 循环,但可能仍然很慢(但值得一试)。 dplyrfilter 也会比基本 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多