问题描述
我是使用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标签