【发布时间】:2015-08-16 11:33:00
【问题描述】:
这是我的数据框的样子:
库(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(每个名称)的累积总和,我在 @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
【问题讨论】:
-
我想知道你是否尝试过实现this
-
@DavidArenburg 嗨,大卫,我将您的解决方案(来自链接)用于另一个问题。给定名称在过去 365 天窗口中的累积运行总数是一个完全独立的问题。
-
是的,我的意思是我想知道您是否尝试修改它以解决您的新问题。这可能是迄今为止最快的解决方案
-
@DavidArenburg 谢谢大卫,我从来没想过。我想知道在这种情况下我可以稍后加入的两个临时数据集是什么。非常感谢任何帮助!
-
我觉得你很快就接受了答案。 30 秒的运行时间很棒,但还有一个 Rcpproll 包;熟悉其(可能更快)方法的人现在可能不愿回答。 (不是我;我只是通过谷歌搜索找到的。)
标签: r vectorization dplyr zoo rollapply