这就是我的数据框架:
库(data.table)
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(对于每个Name)的累积总和,我在@ 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))
但是,当我的数据帧超过150万行时,df $ RunningTotal365 < - f(1:nrow(df))需要很长时间(目前为止超过1.5天) . 我在最初的问题中被建议“rollapply”但我在这个例子中一直在努力弄清楚如何使用它 . 请帮助 .
3 回答
尝试一下:
这是使用
data.table
包中的foverlaps
函数的方法:如有必要,您可以通过执行以下操作删除
start
和end
列:很高兴知道它有多快/慢..
在data.table中使用更新的非equi连接功能: