操纵R数据帧

时间:2016-04-05 00:11:38

标签: r dataframe

我目前有两个独立的数据框,摘录如下:

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

我想要做的是操纵这个,以便我按照下面的方式生成第二个数据框

Player   Gms   Avg.Pts   Avg.Last3   Avg.v.Opp   Avg.@.Grnd
John
James
Jerry
Daniel

我知道如何在Excel中执行此操作,但我在R

中苦苦挣扎

Gms - 每个玩家的游戏总数(excel将是countif)

Avg.Pts - 这是每个玩家名称的平均值(excel将是averageif)

Avg.Last3 - 这是每个玩家在过去3场比赛中的平均值,请注意数据框是按顺序排列的,最近的比赛是在数据框的末尾。

Avg.v.Opp - 这是每个玩家对数据框轮次中定义的下一个对手的平均Pts。例如,John为A队效力,而他的下一个对手是Opp 1.(excel将是平均值)

Avg。@。Grnd - 这是数据框架中定义的下一个场地的每个玩家的平均Pts。例如John为A队效力,他的下一场比赛在Grnd1举行。 (excel将是averageifs)

我尝试过使用dplyr和其他一些选项,但似乎并没有成功地将在此阶段运作的东西组合在一起。请注意,mydata数据框运行超过10,000行。

1 个答案:

答案 0 :(得分:3)

我认为这会奏效。如果您与dput()共享示例数据,我将很乐意复制/粘贴并检查(并在必要时进行调试)。

首先,我会做一些简单的,不依赖于round

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

我想分别做那个,以强调简单案例的干净dplyr。所有" ifs"在您的Excel命令中由开头的单group_by处理。 n()是计数,mean()是平均值。 tail()是一个方便的基函数,它返回数据框或向量的结尾。

要添加round数据,我们希望根据Team列将数据框加入到一起。我们仍然希望能够告诉其他专栏,他们是来自mydata还是round,所以我会重命名round列:

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

然后我们将从join开始,并像以前一样继续。这次我们最后需要一些if,我将在mean次调用中使用一个简单的子集:

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