2017-04-03 8 views
2

私は3ヶ月のウィンドウにわたってベクトルの移動平均を計算しています。私はその下のデータフレームに別の列を追加して、その月の崩壊をしたいと思います。以下の例のよう:誰でもすることができます、私は取得したいと思い何移動平均ウィンドウで文字列を折りたたむ

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

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

だから私の質問は次のとおりです。df[2,]のための今

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)) 

、私は次の取得しますmonth_windowつまり移動平均が計算される範囲を作成するための良い方法をお勧めしますか?私はここだけで、ベースR.

答えて

1

あなただけの基本R・ソリューションをしたい場合は、sapplyを使用することができます。月は、次のように得ることができ開始時と終了時の動作

3

を使用するソリューションを好むだろういくつかのソリューションです:

1)rollapply使用rollapplyと関連したルーチンはxと、このようなmonthに:

与える
library(zoo) 

transform(df, moving_x = rollmean(x, 3, fill = NA), 
    month_window = rollapply(month, 3, paste, collapse = "-", fill = 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> 

2)bパッケージなしASEは、それはより複雑になりますが示すように、あなたは、機能、roll3に増加した複雑さを隠すことができます:

roll3 <- function(x, FUN, ...) { 
    if (length(x) < 3) { 
     rep(NA, length(x)) 
    } else c(NA, apply(embed(x, 3)[, 3:1], 1, FUN, ...), NA) 
} 

transform(df, moving_x = roll3(x, mean), 
       month_window = roll3(as.character(month), paste, collapse = "-")) 

を与える:また

  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> 

は、質問自体が使用することに注意してくださいパッケージ。あなたが好きではない場合は、無効な場所のための機能をifelseでき

df$window <- sapply(1:nrow(df),function(x) paste(df$month[x-1], 
              df$month[x], 
              df$month[x+1],sep="-")) 

df$month <- format(df$Date, "%b") 
+0

これはすばらしい解決策であり、私はこれを今後のアプリケーションに適用する予定です。しかし、これが可能であれば、私はこれに根本的な解決策が必要だと言及していませんでした(今修正されました)。 – boshek

+0

基本溶液を加えました。 –

関連する問題