2016-04-05 51 views
0

我目前有两个单独的数据帧,摘录按照下文:操纵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 

我希望能够做什么是操纵这个,以便我生成第二个数据帧,如下所示

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

我知道如何在Excel中做到这一点,但是我R中挣扎

克 - 游戏对于每一个玩家总数(EXCEL将COUNTIF)

Avg.Pts - 这是平均每个玩家名称的分数(excel会以平均值计算)

Avg.Last3 - 这是每个玩家在过去3场比赛中得分的平均值,请注意,数据框与最近的最后一场比赛相符的数据帧。

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

平均@。Grnd - 这是在数据fram中定义的每个球员在下一个地面的平均值。例如,约翰为A队效力,他的下一场比赛是在Grnd1举行。 (excel将averageifs)

我试过使用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可以是简单的情况。开始时,您的Excel命令中的所有“ifs”都由单个group_by负责。 n()是计数,而mean()是平均值。 tail()是一个方便的基函数,它返回数据帧或向量的结尾。

要添加round数据,我们希望基于Team列来加入数据帧。我们仍然我们希望能够分辨他们是否从mydataround是其他列,所以我会重新命名round列:

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

然后,我们将与join开始并继续像之前一样。这一次,我们需要一些if s的结束,我将与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])) 
+0

这个伟大的工程,都只是“Avg.at.Grnd =平均值( Pts [Grnd == next_grnd])',我得到一个错误的_Error:因素的水平集是不同的_。这可能与事实并不是每周都播放所有的理由有关。 – Morts81

+0

是的,如果你将'Grnd'和'next_grnd'都转换成字符而不是将要处理它的因素列。我将在修改中编辑'dplyr'。 – Gregor

+0

非常好,谢谢你,非常感谢。 – Morts81