2016-04-05 15 views
0

私は現在、2つの独立したデータフレームを持って、下記のとおり抜粋:の操作Rデータフレーム

私が行うことができるようにしたいどのようなMYDATA

Player TG% Pts Team Opp Yr  Rd Grnd 
John 56 42 A  1 2015 1 Grnd1 
James 94 64 B  2 2015 1 Grnd2 
Jerry 85 78 C  3 2015 1 Grnd3 
Daniel 97 51 D  4 2015 1 Grnd4 
John 89 61 A  1 2015 1 Grnd2 
James 65 26 B  4 2015 1 Grnd3 
Jerry 73 34 C  3 2015 1 Grnd2 
Daniel 73 40 D  2 2015 1 Grnd2 
John 89 26 A  1 2015 1 Grnd3 
James 92 42 B  3 2015 1 Grnd1 
Jerry 89 25 C  2 2015 1 Grnd2 
Daniel 80 41 D  4 2015 1 Grnd2 
John 73 82 A  3 2015 1 Grnd3 
James 73 41 B  4 2015 1 Grnd3 
Jerry 89 76 C  2 2015 1 Grnd1 
Daniel 91 77 D  1 2015 1 Grnd2 

ラウンド

Team Opp Grnd 
A  1  Grnd1 
B  3  Grnd4 
C  4  Grnd2 
D  2  Grnd3 

これを操作して、以下のように第2のデータフレームを生成する。

Player Gms Avg.Pts Avg.Last3 Avg.v.Opp [email protected] 
John 
James 
Jerry 
Daniel 

は、私は、しかし、私はRに苦労しています、Excelでこれを行う方法を知っている

GMS - 個々のプレーヤーのためのゲームの合計数(Excelは、COUNTIFされるだろう)

Avg.Pts - これは平均値であります

Avg.Last3 - これは過去3試合の各プレイヤーの平均であり、データフレームは最新のゲームが最後に順番に並んでいることに注意してくださいデータフレームの

平均v.Opp - データフレームラウンドで定義された次の対戦相手に対する各プレーヤーのPtsの平均です。例えば、JohnはチームAのためにプレーし、彼の次の対戦相手はOpp 1です。(平均は最高です)

平均。Grnd - データフレームラウンドで定義された次の地面の各プレーヤーのPtsの平均です。例えば、JohnはAチームでプレーし、次のゲームはGrnd1で行われます。

私はdplyrと他の多くのオプションを使用しようとしましたが、この段階でうまくいくものをまとめるようには思えませんでした。 mydataデータフレームは10,000以上の行に実行されることに注意してください。

答えて

3

これはうまくいくと思います。サンプルデータをdput()と共有している場合は、コピー/貼り付けをして、必要に応じてデバッグしてください。

は、最初に私は簡単なもの、roundに依存しないものをやる:

library(dplyr) 
group_by(mydata, Player) %>% 
    summarize(Gms = n(), 
     Avg.Pts = mean(Pts), 
     Avg.Last3 = mean(tail(Pts, 3))) 

は私が単純な場合のためにすることができますどのようにきれいdplyr強調するために、個別に1つをやってみたかったです。あなたのExcelコマンドのすべての "if"は最初にgroup_byという単一のものによって処理されます。 n()がカウント、mean()が平均です。 tail()は、データフレームまたはベクトルの終わりを返す便利な基底関数です。

データをroundに追加するには、Team列に基づいてデータフレームを結合する必要があります。我々はまだ我々は、彼らがmydataまたはroundからだかどうかを離れて他の列を伝えることができるようにしたいでしょう、私はround列名前を変更します:

round = rename(round, next_opp = Opp, next_grnd = Grnd) 

をその後、我々はjoinで始まり、進みましょう従来通り。我々はを行うこの時間は、私がmean呼び出し内部の簡単なサブセットでやるおり、最後にいくつかのif秒を必要とする:

left_join(mydata, round) %>% 
    # convert ground columns to character as discussed in comments 
    mutate(next_grnd = as.character(next_grnd), 
     Grnd = as.character(Grnd)) %>% 
    group_by(Player) %>% 
    summarize(Gms = n(), 
     Avg.Pts = mean(Pts), 
     Avg.Last3 = mean(tail(Pts, 3)), 
     Avg.v.Opp = mean(Pts[Opp == next_opp]), 
     Avg.at.Grnd = mean(Pts[Grnd == next_grnd])) 
+0

これは、すべての「Avg.at.Grnd =平均(を除いて、素晴らしい作品Pts [Grnd == next_grnd]) '、_Errorのエラーが発生します。これは、毎週、すべての根拠が演じられるわけではないという事実と関係しているかもしれません。 – Morts81

+0

ええ、 'Grnd'と' next_grnd'の両方を、それを世話するファクタの列ではなく、文字に変換するとします。 'dplyr'で行う変更を編集します。 – Gregor

+0

よかった、ありがとう、これは非常に感謝しています。 – Morts81

関連する問題