我确定之前提出过这个问题,但我想就我的具体问题提出一些意见.作为对你的帮助的回报,我将使用一个有趣的例子.
Sean Lahman提供MLB棒球统计数据的巨型数据集,可在他的网站上免费获取(http://www.seanlahman.com/baseball-archive/statistics/).
我想用这些数据来回答以下问题:美国职业棒球大联盟每十年记录的每场比赛的本垒打平均数是多少?
下面我贴了所有相关的脚本:
teamdata = read.csv("Teams.csv", header = TRUE)
decades = c(1870,1880,1890,1900,1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010,2020)
i = 0
meanhomers = c()
for(i in c(1:length(decades))){
meanhomers[i] = mean(teamdata$HR[teamdata$yearID>=decades[i] & teamdata$yearID<decades[i+1]]);
i = i+1
}
Run Code Online (Sandbox Code Playgroud)
我的主要问题是,如何在不诉诸可怕的for-loop的情况下确定这个答案?
附带问题:什么简单的脚本会为我生成数十年的向量?
(对于那些对棒球问题的答案感兴趣的人,请参阅下文.)
meanhomers
[1] 4.641026 23.735849 34.456522 20.421053 25.755682 61.837500 84.012500
[8] 80.987500 130.375000 132.166667 120.093496 126.700000 148.737410 173.826667
[15] 152.973333 NaN
Run Code Online (Sandbox Code Playgroud)
为清晰起见编辑:结果我回答了错误的问题; 上面提供的答案表示每队每年的本垒打次数,而不是每场比赛.对分母的一点修正就能得到正确的结果.
这是一个data.table例子.因为其他人展示了如何使用cut,我采取了另一条路线将数据分成几十年:
teamdata[,list(HRperYear=mean(HR)),by=10*floor((yearID)/10)]
Run Code Online (Sandbox Code Playgroud)
然而,最初的问题提到了每场比赛的平均人力资源,而不是每年(尽管代码和答案明确涉及每年的人力资源).
以下是如何计算每场比赛的平均人力资源(以及每队每年的平均比赛数):
teamdata[,list(HRperYear=mean(HR),HRperGame=sum(HR)/sum(G),games=mean(G)),by=10*floor(yearID/10)]
floor HRperYear HRperGame games
1: 1870 4.641026 0.08911866 52.07692
2: 1880 23.735849 0.21543555 110.17610
3: 1890 34.456522 0.25140108 137.05797
4: 1900 20.421053 0.13686067 149.21053
5: 1910 25.755682 0.17010657 151.40909
6: 1920 61.837500 0.40144445 154.03750
7: 1930 84.012500 0.54593453 153.88750
8: 1940 80.987500 0.52351325 154.70000
9: 1950 130.375000 0.84289640 154.67500
10: 1960 132.166667 0.81977946 161.22222
11: 1970 120.093496 0.74580935 161.02439
12: 1980 126.700000 0.80990313 156.43846
13: 1990 148.737410 0.95741873 155.35252
14: 2000 173.826667 1.07340167 161.94000
15: 2010 152.973333 0.94427984 162.00000
Run Code Online (Sandbox Code Playgroud)
(1980年代和1990年代的平均游戏总数较低是由于1981年和1994年的玩家罢工造成的).