2017-11-02 22 views
-1

シーズンの変数と変数はplayer_id,weekpointsです(一致する各プレーヤーの成績)。論理条件を使用して平均を計算する

したがって、それぞれplayer_idが私のデータセットに数回現れます。

私の目標は、各プレイヤーの平均ポイントを計算することですが、前の数週間だけにします。たとえば、データがplayer_id=5445と週を持っている場合player_id=5445week=10が、私は平均したい行に私はそれが各行のデータをフィルタリングし、それを計算しないことを知って1から9

です。しかし、私は賢く/より高速な方法でそれを行うことを期待...

は、私のような何かを考えた:

aggregate(mydata$points, FUN=mean, 
      by=list(player_id=mydata$player_id, week<mydata$week)) 

をそれは

Thankssを動作しませんでした!ここで

+1

あなたはplayer_idそれはしかし唯一の問題だ== MYDATA $ player_id'わからない'のような二重の等号が必要です。 – Mako212

+0

サンプルデータを含めて質問を再現できるようにしたら、助けになります。また、player_idとweekの組み合わせごとに1行が正確に表示されますか? – jruf003

+0

再現可能にするplayer_id <-c(3242,56546,76575,4234,654654,6564,43242,42344,4342,6776,5432,8796,54767) 週<-1:30 ポイント<-rnorm(390 ) MYDATA < - data.frame(player_id =担当者(player_id、30)、週=担当者(週、13)、ポイント) 私はPrevious_mean –

答えて

1

football_df <- 
    data.frame(player_id = c(1, 2, 3, 4), 
      points = as.integer(runif(40, 0, 10)), 
      week = rep(1:10, each = 4)) 

は、移動平均の取得、いくつかのサンプルデータと一緒にソリューションです:

require(dplyr) 
football_df %>% 
     group_by(player_id) %>% # the group to perform the stat on 
     arrange(week) %>%   # order the weeks within each group 
     mutate(avg = cummean(points)) %>% # for each week get the cumulative mean 
     mutate(avg = lag(avg)) %>% # shift cumulative mean back one week 
     arrange(player_id) # sort by player_id 

ここでは、プレーヤーのためにそれを見ることができるために結果表の最初の2人の選手です前週の平均は(9 + 7)/ 2 = 8 ...となります。

player_id points week  avg 
1   1  7 1  NA 
2   1  9 2 7.000000 
3   1  9 3 8.000000 
4   1  1 4 8.333333 
5   1  4 5 6.500000 
6   1  8 6 6.000000 
7   1  0 7 6.333333 
8   1  2 8 5.428571 
9   1  5 9 5.000000 
10   1  8 10 5.000000 
11   2  6 1  NA 
12   2  9 2 6.000000 
13   2  5 3 7.500000 
14   2  1 4 6.666667 
15   2  0 5 5.250000 
16   2  9 6 4.200000 
17   2  8 7 5.000000 
18   2  6 8 5.428571 
19   2  6 9 5.500000 
20   2  8 10 5.555556 
+0

おかげと呼ばれる追加の列を作成したいと思います。しかし、私は何かが欠けていると思う。プレイヤーではなく、週ごとに平均を計算しています。そして、別のこと...週が1に等しいときに、どのプレーヤーにも以前の平均を持たせることはできません。 –

+0

いいえ、各プレーヤーの最初の週から先週までの平均を計算しています。あなたは1週間目の平均がないので、その値は「NA」です。多分、あなたが 'arrange(player_id)'で終わるかどうかを見直す方が簡単かもしれません。 – ssp3nc3r

+0

'mean'と' cummean'の違いに気をつけてください。 – ssp3nc3r

1

私はあなたのデータを使用しますが、結果を再現できるようにset.seedを呼び出して使用します。次に、式のインターフェイスでaggregateと呼んでいます。変数weekの名前をlast_weekに変更してsubsetで使用するように変更しました。 `player_id = MYDATA $ player_id`機能するために

set.seed(2550) # make the results reproducible 

player_id <- c(3242,56546,76575,4234,654654,6564,43242,42344,4342,6776,5432,8796,54767) 
week <- 1:30 
points <- rnorm(390) 
mydata <- data.frame(player_id = rep(player_id, 30), 
        week = rep(week,13),points) 

last_week <- 10 
agg <- aggregate(points ~ player_id + week, data = subset(mydata, week < last_week), mean) 
head(agg) 
# player_id week  points 
#1  3242 1 -1.3281831 
#2  4234 1 0.3578657 
#3  4342 1 -0.8267423 
#4  5432 1 -0.4245487 
#5  6564 1 -0.2968879 
#6  6776 1 0.8348178