r - 在过去 365 天窗口中执行总计的有效方法

标签 r vectorization dplyr zoo rollapply

这是我的数据框的样子:

图书馆(数据表)

df <- fread('
                Name  EventType  Date  SalesAmount RunningTotal Runningtotal(prior365Days)
                John    Email      1/1/2014      0          0            0
                John    Sale       2/1/2014     10          10           10
                John    Sale       7/1/2014     20          30           30
                John    Sale       4/1/2015     30          60           50 
                John    Webinar    5/1/2015      0          60           50
                Tom     Email      1/1/2014      0          0            0
                Tom     Sale       2/1/2014     15          15           15
                Tom     Sale       7/1/2014     10          25           25
                Tom     Sale       4/1/2015     25          50           35 
                Tom     Webinar    5/1/2015      0          50           35
                ')
    df[,Date:= as.Date(Date, format="%m/%d/%Y")]

最后一列是我想要的列,它是过去 365 天滚动窗口中 SalesAmount(对于每个名称)的累积总和,我在 @6pool 的帮助下执行了此操作。他的解决办法是:
df$EventDate <- as.Date(df$EventDate, format="%d/%m/%Y")
df <- df %>%
   group_by (Name) %>%
   arrange(EventDate) %>% 
   mutate(day = EventDate - EventDate[1])

f <- Vectorize(function(i)
    sum(df[df$Name[i] == df$Name & df$day[i] - df$day >= 0 & 
             df$day[i] - df$day <= 365, "SalesAmount"]), vec="i")
df$RunningTotal365 <- f(1:nrow(df))

但是,df$RunningTotal365 <- f(1:nrow(df)) 需要很长时间(到目前为止超过 1.5 天),因为我的数据框超过 150 万行。我在最初的问题中被建议使用“rollapply”,但我一直在努力弄清楚如何在这种情况下使用它。请帮忙。

最佳答案

试试这个:

DF <- read.table(text = "Name  EventType  EventDate  SalesAmount RunningTotal Runningtotal(prior365Days)
John    Email      1/1/2014      0          0            0
John    Sale       2/1/2014     10          10           10
John    Sale       7/1/2014     20          30           30
John    Sale       4/1/2015     30          60           50 
John    Webinar    5/1/2015      0          60           50
Tom     Email      1/1/2014      0          0            0
Tom     Sale       2/1/2014     15          15           15
Tom     Sale       7/1/2014     10          25           25
Tom     Sale       4/1/2015     25          50           35 
Tom     Webinar    5/1/2015      0          50           35", header = TRUE)


fun <- function(x, date, thresh) {
  D <- as.matrix(dist(date)) #distance matrix between dates
  D <- D <= thresh
  D[lower.tri(D)] <- FALSE #don't sum to future
  R <- D * x #FALSE is treated as 0
  colSums(R)
}


library(data.table)
setDT(DF)
DF[, EventDate := as.Date(EventDate, format = "%m/%d/%Y")]
setkey(DF, Name, EventDate)

DF[, RT365 := fun(SalesAmount, EventDate, 365), by = Name]

#    Name EventType  EventDate SalesAmount RunningTotal Runningtotal.prior365Days. RT365
# 1: John     Email 2014-01-01           0            0                          0     0
# 2: John      Sale 2014-02-01          10           10                         10    10
# 3: John      Sale 2014-07-01          20           30                         30    30
# 4: John      Sale 2015-04-01          30           60                         50    50
# 5: John   Webinar 2015-05-01           0           60                         50    50
# 6:  Tom     Email 2014-01-01           0            0                          0     0
# 7:  Tom      Sale 2014-02-01          15           15                         15    15
# 8:  Tom      Sale 2014-07-01          10           25                         25    25
# 9:  Tom      Sale 2015-04-01          25           50                         35    35
#10:  Tom   Webinar 2015-05-01           0           50                         35    35

关于r - 在过去 365 天窗口中执行总计的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30600073/

相关文章:

r - 如何过滤数据帧以获取连续增加的值

用 dplyr::group_split 和 purrr::map_df 替换 dplyr::do 函数

r - 在 R 中使用 as.numeric 以及函数和管道

r - 将 {{}}(dplyr 双花括号)插值转换为字符串

r - 在 R 中的向量中选择偶数的函数

r - 指定不同类型的缺失值 (NA)

R随机化和随机化数据表的列

python - 使用 sklearn 哈希向量化器获取相似度百分比

r - 对向量的某些元素执行操作

python - 如何使用 bool 行的二维数组来过滤另一个二维数组?