【问题标题】:R: RunningTotal in the last 365 days window by NameR:按名称划分的过去 365 天窗口中的 RunningTotal
【发布时间】:2015-05-29 17:33:54
【问题描述】:

这就是我的数据的样子。最右边的列是我的 Desired Column。

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

我只是想获取过去 365 天窗口中每个名称的销售总额。对于我使用的一般“RunningTotal”列:

df<- df%>%
   group_by (Name)%>%
    mutate(RunningTotal = cumsum(SalesAmount))

但我不知道如何仅在过去 365 天的窗口中获取运行总数。请帮助。衷心感谢您的帮助!

【问题讨论】:

标签: r data.table dplyr zoo


【解决方案1】:
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))

【讨论】:

  • 非常感谢。尽管我不知道该函数 f 内部发生了什么,但它工作得很好。 “i”符号是否将每一行与前一行进行比较?
  • @gibbz00 i 就像for 循环中的索引一样。 Vectorize 只允许您将向量传递给函数f,因此您不需要显式循环。
  • @frank 非常感谢。但是 df$RunningTotal365
  • @gibbz00 我想你不小心@了我,虽然这不是我的答案。你不需要@ ping 6pool,因为他们会在他们的帖子上收到所有 cmets 的通知。无论如何,如果您需要效率,您可能正在从 zoo 包中寻找 rollapply。我自己没有这方面的经验。
  • @Frank 非常感谢弗兰克在这方面给了我领导,并且故意联系你。
猜你喜欢
  • 2015-08-16
  • 2021-03-05
  • 2020-09-29
  • 2023-04-06
  • 2011-11-06
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多