2016-03-14 8 views
5

これに答えられた場合はお詫び申し上げます。私は今日、数多くの例を見てきましたが、私がしようとしているものは見つけられません。複数の列の平均値の移動 - グループ化されたデータ

私は3点移動平均を計算するために必要なデータセットを持っています。私は「数量」と「から」列の両方のための 'セクションの列に基づいて、各グループのMAを計算したい

set.seed(1234) 
data.frame(Week = rep(seq(1:5), 3), 
Section = c(rep("a", 5), rep("b", 5), rep("c", 5)), 
Qty = runif(15, min = 100, max = 500), 
To = runif(15, min = 40, max = 80)) 

:私は以下のいくつかのダミーデータを生成しました。理想的には、出力はデータテーブルになります。移動平均は3週目から始まりますので、1:3の平均となります。

私はdata.tableパッケージをマスターしようとしています。それを使用するソリューションはすばらしいと思いますが、そうでなければ何かが大いに評価されます。

私の実際のデータセットは参考用です。合計でc.1M行の70のセクション。私はdata.tableがこれまでのところこの種のボリュームを処理するのに非常に高速であることを発見しました。

+0

はhttp://stackoverflow.com/questions/32649913/calculating-sum-of-previous-3-rows-in-([こちら]も参照してください。いくつかのオプションのためのr - data-table-by-grid-square /) –

答えて

5

zooパッケージのrollmeandata.tableと組み合わせて使用​​できます。

library(data.table) 
library(zoo) 
setDT(df)[, c("Qty.mean","To.mean") := lapply(.SD, rollmean, k = 3, fill = NA, align = "right"), 
       .SDcols = c("Qty","To"), by = Section] 
> df 
# Week Section  Qty  To Qty.mean To.mean 
#1: 1  a 145.4814 73.49183  NA  NA 
#2: 2  a 348.9198 51.44893  NA  NA 
#3: 3  a 343.7099 50.67283 279.3703 58.53786 
#4: 4  a 349.3518 47.46891 347.3271 49.86356 
#5: 5  a 444.3662 49.28904 379.1426 49.14359 
#6: 1  b 356.1242 52.66450  NA  NA 
#7: 2  b 103.7983 52.10773  NA  NA 
#8: 3  b 193.0202 46.36184 217.6476 50.37802 
#9: 4  b 366.4335 41.59984 221.0840 46.68980 
#10: 5  b 305.7005 48.75198 288.3847 45.57122 
#11: 1  c 377.4365 72.42394  NA  NA 
#12: 2  c 317.9899 61.02790  NA  NA 
#13: 3  c 213.0934 76.58633 302.8400 70.01272 
#14: 4  c 469.3734 73.25380 333.4856 70.28934 
#15: 5  c 216.9263 41.83081 299.7977 63.89031 
+0

あなたはOPと同じシードを使いましたか? – agenis

+0

@mtotoクイック返信ありがとう、それはまさに私が必要なものです! – MidnightDataGeek

+0

あなたは正しいです、答えが更新されました。 – mtoto

1

dplyrを使用したソリューション:

library(dplyr); library(zoo) 
myfun = function(x) rollmean(x, k = 3, fill = NA, align = "right") 
df %>% group_by(Section) %>% mutate_each(funs(myfun), Qty, To) 
#### Week Section  Qty  To 
#### (int) (fctr) (dbl) (dbl) 
#### 1  1  a  NA  NA 
#### 2  2  a  NA  NA 
#### 3  3  a 279.3703 58.53786 
#### 4  4  a 347.3271 49.86356 
+0

ありがとうございます!同じ問題を複数の方法で解決できるかどうかを確認することは良いことです。 – MidnightDataGeek

関連する問題