我目前有两个独立的数据框,摘录如下:
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行。
答案 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]))