R 在移动平均线窗口上折叠字符串

R 在移动平均线窗口上折叠字符串,r,R,我在计算一个向量在3个月窗口内的移动平均值。我想在下面的数据框中添加另一列,它将在窗口中折叠几个月。因此,在下面的示例中: library(lubridate) df <- data.frame(Date = seq(as.Date("2000/1/1"), by = "month", length.out = 12), x = rnorm(12)) df$month <- month(df$Date, abbr = TRUE, label = TRUE) df$moving_

我在计算一个向量在3个月窗口内的移动平均值。我想在下面的数据框中添加另一列,它将在窗口中折叠几个月。因此,在下面的示例中:

library(lubridate)

df <- data.frame(Date = seq(as.Date("2000/1/1"), by = "month", length.out = 12), x = rnorm(12))

df$month <- month(df$Date, abbr = TRUE, label = TRUE)

df$moving_x <- as.numeric(stats::filter(df$x,rep(1/3,3), sides=2))
我想要的是

> df[2,]
        Date          x month     moving_x month_window
2 2000-02-01 0.07902587   Feb -0.008438176 Jan-Feb-Mar

所以我的问题是,有谁能推荐一种创建月窗口的好方法,即移动平均线的计算范围?我更喜欢只使用基本R的解决方案。

以下是一些解决方案:

1 rollapply在x和月份使用rollapply和相关例程,如下所示:

library(zoo)

transform(df, moving_x = rollmean(x, 3, fill = NA), 
   month_window = rollapply(month, 3, paste, collapse = "-", fill = NA))
df$month <- format(df$Date, "%b")
给予:

         Date           x month   moving_x month_window
1  2000-01-01  0.37963948   Jan         NA         <NA>
2  2000-02-01 -0.50232345   Feb -0.1519638  Jan-Feb-Mar
3  2000-03-01 -0.33320738   Mar -0.6180354  Feb-Mar-Apr
4  2000-04-01 -1.01857538   Apr -0.8078580  Mar-Apr-May
5  2000-05-01 -1.07179123   May -0.5956127  Apr-May-Jun
6  2000-06-01  0.30352864   Jun -0.1066843  May-Jun-Jul
7  2000-07-01  0.44820978   Jul  0.2682475  Jun-Jul-Aug
8  2000-08-01  0.05300423   Aug  0.4744938  Jul-Aug-Sep
9  2000-09-01  0.92226747   Sep  1.0084521  Aug-Sep-Oct
10 2000-10-01  2.05008469   Oct  0.8271070  Sep-Oct-Nov
11 2000-11-01 -0.49103117   Nov -0.2500385  Oct-Nov-Dec
12 2000-12-01 -2.30916888   Dec         NA         <NA>
         Date           x month   moving_x month_window
1  2000-01-01  0.37963948   Jan         NA         <NA>
2  2000-02-01 -0.50232345   Feb -0.1519638  Jan-Feb-Mar
3  2000-03-01 -0.33320738   Mar -0.6180354  Feb-Mar-Apr
4  2000-04-01 -1.01857538   Apr -0.8078580  Mar-Apr-May
5  2000-05-01 -1.07179123   May -0.5956127  Apr-May-Jun
6  2000-06-01  0.30352864   Jun -0.1066843  May-Jun-Jul
7  2000-07-01  0.44820978   Jul  0.2682475  Jun-Jul-Aug
8  2000-08-01  0.05300423   Aug  0.4744938  Jul-Aug-Sep
9  2000-09-01  0.92226747   Sep  1.0084521  Aug-Sep-Oct
10 2000-10-01  2.05008469   Oct  0.8271070  Sep-Oct-Nov
11 2000-11-01 -0.49103117   Nov -0.2500385  Oct-Nov-Dec
12 2000-12-01 -2.30916888   Dec         NA         <NA>
给予:

         Date           x month   moving_x month_window
1  2000-01-01  0.37963948   Jan         NA         <NA>
2  2000-02-01 -0.50232345   Feb -0.1519638  Jan-Feb-Mar
3  2000-03-01 -0.33320738   Mar -0.6180354  Feb-Mar-Apr
4  2000-04-01 -1.01857538   Apr -0.8078580  Mar-Apr-May
5  2000-05-01 -1.07179123   May -0.5956127  Apr-May-Jun
6  2000-06-01  0.30352864   Jun -0.1066843  May-Jun-Jul
7  2000-07-01  0.44820978   Jul  0.2682475  Jun-Jul-Aug
8  2000-08-01  0.05300423   Aug  0.4744938  Jul-Aug-Sep
9  2000-09-01  0.92226747   Sep  1.0084521  Aug-Sep-Oct
10 2000-10-01  2.05008469   Oct  0.8271070  Sep-Oct-Nov
11 2000-11-01 -0.49103117   Nov -0.2500385  Oct-Nov-Dec
12 2000-12-01 -2.30916888   Dec         NA         <NA>
         Date           x month   moving_x month_window
1  2000-01-01  0.37963948   Jan         NA         <NA>
2  2000-02-01 -0.50232345   Feb -0.1519638  Jan-Feb-Mar
3  2000-03-01 -0.33320738   Mar -0.6180354  Feb-Mar-Apr
4  2000-04-01 -1.01857538   Apr -0.8078580  Mar-Apr-May
5  2000-05-01 -1.07179123   May -0.5956127  Apr-May-Jun
6  2000-06-01  0.30352864   Jun -0.1066843  May-Jun-Jul
7  2000-07-01  0.44820978   Jul  0.2682475  Jun-Jul-Aug
8  2000-08-01  0.05300423   Aug  0.4744938  Jul-Aug-Sep
9  2000-09-01  0.92226747   Sep  1.0084521  Aug-Sep-Oct
10 2000-10-01  2.05008469   Oct  0.8271070  Sep-Oct-Nov
11 2000-11-01 -0.49103117   Nov -0.2500385  Oct-Nov-Dec
12 2000-12-01 -2.30916888   Dec         NA         <NA>
另外,请注意问题本身使用了一个包。月份可以这样获得:

library(zoo)

transform(df, moving_x = rollmean(x, 3, fill = NA), 
   month_window = rollapply(month, 3, paste, collapse = "-", fill = NA))
df$month <- format(df$Date, "%b")

如果您想要唯一的base R解决方案,您可以使用sapply:


如果您不喜欢开始和结束时的行为,您可以为无效位置使用函数

这是一个令人惊讶的解决方案,我将把它归档以备将来应用。然而,我没有提到现在我需要一个基本的R解决方案,如果可能的话。我已经添加了基本的解决方案。