根据R中的行索引计算滚动总和
calculate rolling sum based on row index in R
我正在尝试根据 window 大小 k 计算分组滚动总和,但是如果组内行索引 (n) 小于 k,我想计算滚动总和使用条件 k=min(n,k)。
我的问题类似于这个问题,但我正在寻找一种为每一行提供非 NA 值的解决方案。
我可以使用 dplyr 和 rollsum 到达那里:
library(zoo)
library(dplyr)
df <- data.frame(Date=rep(seq(as.Date("2000-01-01"),
as.Date("2000-12-01"),by="month"),2),
ID=c(rep(1,12),rep(2,12)),value=1)
df <- tbl_df(df)
df <- df %>%
group_by(ID) %>%
mutate(total3mo=rollsum(x=value,k=3,align="right",fill="NA"))
df
Source: local data frame [24 x 4]
Groups: ID [2]
Date ID value tota3mo
(date) (dbl) (dbl) (dbl)
1 2000-01-01 1 1 NA
2 2000-02-01 1 1 NA
3 2000-03-01 1 1 3
4 2000-04-01 1 1 3
5 2000-05-01 1 1 3
6 2000-06-01 1 1 3
7 2000-07-01 1 1 3
8 2000-08-01 1 1 3
9 2000-09-01 1 1 3
10 2000-10-01 1 1 3
.. ... ... ... ...
在这种情况下,我想要的是 return 2000-01-01 的观察值 1 和 2000-02-01 的观察值 2。更一般地说,我希望在最大 window 但不大于 k 的范围内计算滚动总和。
在这种特殊情况下,手动更改某些 NA 值并不太困难。但是,最终我想在我的数据框中添加更多列,这些列将根据各种 windows 计算出滚动总和。在这种更一般的情况下,手动返回更改许多 NA 值会变得非常乏味。
使用 rollapplyr
的 partial=TRUE
参数:
df %>%
group_by(ID) %>%
mutate(roll = rollapplyr(value, 3, sum, partial = TRUE)) %>%
ungroup()
或没有 dplyr(仍然需要动物园):
roll <- function(x) rollapplyr(x, 3, sum, partial = TRUE)
transform(df, roll = ave(value, ID, FUN = roll))
我正在尝试根据 window 大小 k 计算分组滚动总和,但是如果组内行索引 (n) 小于 k,我想计算滚动总和使用条件 k=min(n,k)。
我的问题类似于这个问题
我可以使用 dplyr 和 rollsum 到达那里:
library(zoo)
library(dplyr)
df <- data.frame(Date=rep(seq(as.Date("2000-01-01"),
as.Date("2000-12-01"),by="month"),2),
ID=c(rep(1,12),rep(2,12)),value=1)
df <- tbl_df(df)
df <- df %>%
group_by(ID) %>%
mutate(total3mo=rollsum(x=value,k=3,align="right",fill="NA"))
df
Source: local data frame [24 x 4]
Groups: ID [2]
Date ID value tota3mo
(date) (dbl) (dbl) (dbl)
1 2000-01-01 1 1 NA
2 2000-02-01 1 1 NA
3 2000-03-01 1 1 3
4 2000-04-01 1 1 3
5 2000-05-01 1 1 3
6 2000-06-01 1 1 3
7 2000-07-01 1 1 3
8 2000-08-01 1 1 3
9 2000-09-01 1 1 3
10 2000-10-01 1 1 3
.. ... ... ... ...
在这种情况下,我想要的是 return 2000-01-01 的观察值 1 和 2000-02-01 的观察值 2。更一般地说,我希望在最大 window 但不大于 k 的范围内计算滚动总和。
在这种特殊情况下,手动更改某些 NA 值并不太困难。但是,最终我想在我的数据框中添加更多列,这些列将根据各种 windows 计算出滚动总和。在这种更一般的情况下,手动返回更改许多 NA 值会变得非常乏味。
使用 rollapplyr
的 partial=TRUE
参数:
df %>%
group_by(ID) %>%
mutate(roll = rollapplyr(value, 3, sum, partial = TRUE)) %>%
ungroup()
或没有 dplyr(仍然需要动物园):
roll <- function(x) rollapplyr(x, 3, sum, partial = TRUE)
transform(df, roll = ave(value, ID, FUN = roll))