2016-10-07 9 views
0

日付ごとに複数の観測を含む可能性があるデータセットがあります。したがって、日付1の観測は5回、日付2の観測は2回、グループ3の観測は1回になる可能性があります。日付ごとに複数の観測を持つユニークな日付による移動平均

私は移動平均を日付で計算したいのですが、重要なことに、行数を要約/縮小していません。つまり、上記の例ではまだ8行のデータがあります。その横の列には、この日付のローリング平均価格があります。ZOOパッケージの標準ローリング関数を使用すると、

df %>% groupy_by(DATE) %>% summarise(mean_daily_price = mean(price)) %>% ungroup() %>% arrange(Date) %>% mutate(ra = rollapply(price, 2, mean, partial=T) 

---しかし、まとめたものが、私は、行を失うことになり:-line、私はそれがDATE

でスキップして取得する方法を知って、たとえば最初のステップは、通常になりますいけません。以下のコードで

 library(dplyr) 
     library(zoo) 


      DF = structure(list(Date = c("Jan-13", "Jan-13", "Jan-13", "Jan-13", "Jan-13", "Jul-14", "Jul-14", "Oct-16"), Price = c(100L, 200L, 300L, 1000L, 400L, 150L, 50L, 600L), Average.by.Date = c(400L, 400L, 400L, 400L, 400L, 100L, 100L, 600L), Moving_Average_Size_2 = c(NA, NA, NA, NA, NA, 250L, 250L, 350L)), .Names = c("Date", "Price", "Average.by.Date", "Moving_Average_Size_2"), class = "data.frame", row.names = c(NA, 
-8L)) 
+1

あなたの質問は少し不明です。期待される成果は? 「日付でスキップする」とはどういう意味ですか? – jdobres

+1

コード内の変数名がデータフレーム内の変数名と一致し、コードに他のタイプミスがないことを確認してください。 – eipi10

答えて

0

私はあなたの最も安全なアプローチは、2段階のプロセスが必要になりますことを考える - Dateによってローリング平均値を算出し、その後

(まだここ dplyrを使用して)でそれらをバックマージ
rolledAvg <- 
    DF %>% 
    group_by(Date) %>% 
    summarise(mean_daily_price = mean(Price)) %>% 
    ungroup() %>% 
    arrange(Date) %>% 
    mutate(ra = rollapply(mean_daily_price 
         , 2 
         , mean 
         , partial=T 
         , fill = NA)) 

left_join(DF, rolledAvg) 

ができます:

Date Price Average.by.Date Moving_Average_Size_2 mean_daily_price ra 
1 Jan-13 100    400     NA    400 250 
2 Jan-13 200    400     NA    400 250 
3 Jan-13 300    400     NA    400 250 
4 Jan-13 1000    400     NA    400 250 
5 Jan-13 400    400     NA    400 250 
6 Jul-14 150    100     250    100 350 
7 Jul-14 50    100     250    100 350 
8 Oct-16 600    600     350    600 600 

最初のraが250であるとは思わないという別の回答へのコメントを参照してください。そのような場合は、電話の計算をrollapplyに変更してください。今は、期待どおりに動作しているように見える/文書化されています。だから、あなたが何か違うものを求めているならば、あなたは望む変更を説明する必要があります(おそらく別の質問です)。

この他にも他の読者にとっては重要なもう1つの注意点があります。この現在のアプローチでは、実際の距離にかかわらず、連続した日付エントリを等距離で扱います。これがあなたの必要性のために働くならば、素晴らしい。しかし、多くのユースケースでは、測定間の実際の時間を処理する必要があります。

同様に、現在のアプローチでは測定値の数に関する情報がすべて失われるため、観測数で重み付けするアプローチを検討する価値があります(毎日の計算平均を信頼していない限り)。

+1

別々の 'left_join'の代わりに' right_join(DF) 'をチェーンに追加することもできます。 – eipi10

+0

'rollapply'の代わりに' rollapplyr'を試してください。また、左結合が 'left_join(x = DF)'と書かれていれば、パイプラインの最後に追加することができます。 –

+0

@ eipi10と@G Grothendieckの両方とも、パイプライン/チェーンの最後にコール( 'left_join'または' right_join')を追加できるということが正しいです。私はそれらをここで分けておき、 '* _join'が答えのユニークな部分であったことを強調しました(そして、質問の構造は*右*、最初のステップと考えられます)。 –

1

、我々は、データフレームのすべての行を保つように、mean_daily_priceを追加するmutateの代わりsummariseを使用しています。次に、最後のmutateでは、mean_daily_priceというユニークな値でのみrollapplyを実行しますが、の行数でrollapplyの出力を繰り返すには、tablerepを使用してください。

DF %>% 
    arrange(Date) %>% 
    group_by(Date) %>% 
    mutate(mean_daily_price = mean(Price)) %>% 
    ungroup() %>% 
    mutate(ra = rep(rollapply(unique(mean_daily_price), 2, mean, fill=NA, align="right"), 
        table(Date)[order(unique(Date))])) 
Date Price Average.by.Date Moving_Average_Size_2 mean_daily_price ra 
1 Jan-13 100    400     NA    400 NA 
2 Jan-13 200    400     NA    400 NA 
3 Jan-13 300    400     NA    400 NA 
4 Jan-13 1000    400     NA    400 NA 
5 Jan-13 400    400     NA    400 NA 
6 Jul-14 150    100     250    100 250 
7 Jul-14 50    100     250    100 250 
8 Oct-16 600    600     350    600 350 
+0

申し訳ありませんが、これは正しく出ていません。 MOVING_AVERAGE_SIZE_2はここでの正しい答えです(またはNULLS = 400かもしれません)。また、多分私は何かを逃しているかもしれませんが、ユニークな(mean_daily_prrice)---私は複数の日付に同じ平均価格を持っていますか? – runningbirds

+0

更新されたコードを参照してください。 – eipi10

関連する問題