【问题标题】:calculate rolling sum based on row index in R根据R中的行索引计算滚动总和
【发布时间】:2015-10-21 23:44:46
【问题描述】:

我正在尝试根据窗口大小 k 计算分组滚动总和,但如果组内行索引 (n) 小于 k,我想使用条件 k=min 计算滚动总和(n,k)。

我的问题与R dplyr rolling sum 类似,但我正在寻找一种为每一行提供非 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
..        ...   ...   ...     ...

在这种情况下,我希望为 2000-01-01 的观察返回值 1,为 2000-02-01 的观察返回值 2。更一般地说,我希望在可能的最大窗口上计算滚动和,但不大于 k。

在这种特殊情况下,手动更改一些 NA 值并不难。但是,最终我想在我的数据框中添加更多列,这些列将滚动计算在各个窗口上的总和。在这种更一般的情况下,手动返回更改许多 NA 值将变得非常乏味。

【问题讨论】:

    标签: r function window


    【解决方案1】:

    使用rollapplyrpartial=TRUE 参数:

    df %>%
       group_by(ID) %>%
       mutate(roll = rollapplyr(value, 3, sum, partial = TRUE)) %>%
       ungroup()
    

    或者没有 dplyr(仍然需要 zoo):

    roll <- function(x) rollapplyr(x, 3, sum, partial = TRUE)
    transform(df, roll = ave(value, ID, FUN = roll))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 2020-10-23
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      相关资源
      最近更新 更多