如何计算具有多个变量的滚动总和或滚动平均值 更新以发表评论

问题描述

我是使用Zoo软件包的新手,所以也许这是一个简单的问题。 我有以下数据框(df):

library(lubridate)
library(zoo)
library(dplyr)

Date <- c("2010-01-28","2010-01-28","2010-02-28","2010-03-28","2010-04-28","2010-04-28")

Date <- as_date(Date)
Amount <- 1:8
Prod <- c("Corn","Potato","Corn","Potato")
df <- data.frame(Date,Prod,Amount)
print(df)

 Date         Prod    Amount
 2010-01-28   Corn      1
 2010-01-28 Potato      2
 2010-02-28   Corn      3
 2010-02-28 Potato      4
 2010-03-28   Corn      5
 2010-03-28 Potato      6
 2010-04-28   Corn      7
 2010-04-28 Potato      8

我想要的是计算每个变量的滚动总和,其“窗口”为3天,然后创建一个新的数据框,如下所示:

 Date        Prod     Amount
 2010-03-28   Corn      9
 2010-03-28 Potato      12
 2010-04-28   Corn      15
 2010-04-28 Potato      18

也许rollapply()dplyr可以完成这项工作,但是我不知道如何解决这个问题。 如果有人可以提供帮助,我表示感谢:)

解决方法

我使用dplyr::lag()

library(dplyr)
library(tibble)

## Data
data <- tribble(
  ~Date,~Prod,~Amount,"2010-01-28","Corn",1,"Potato",2,"2010-02-28",3,4,"2010-03-28",5,6,"2010-04-28",7,8
)

# Code

data %>% 
  group_by(Prod) %>% 
  mutate(cum_amount = Amount + lag(Amount,1) + lag(Amount,2)) %>% 
  filter(!is.na(cum_amount))


# A tibble: 4 x 4
# Groups:   Prod [2]
  Date       Prod   Amount cum_amount
  <chr>      <chr>   <dbl>      <dbl>
1 2010-03-28 Corn        5          9
2 2010-03-28 Potato      6         12
3 2010-04-28 Corn        7         15
4 2010-04-28 Potato      8         18

更新以发表评论

data %>% 
  group_by(Prod) %>% 
  mutate(cum_amount = c(rep(NA,2),zoo::rollsum(Amount,3))) %>% 
  filter(!is.na(cum_amount))

PS:请记住在您的问题中包含R标签