避免R中的For-Loops

ady*_*552 3 for-loop r

我确定之前提出过这个问题,但我想就我的具体问题提出一些意见.作为对你的帮助的回报,我将使用一个有趣的例子.

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)

为清晰起见编辑:结果我回答了错误的问题; 上面提供的答案表示每队每年的本垒打次数,而不是每场比赛.对分母的一点修正就能得到正确的结果.

BCC*_*BCC 6

这是一个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年的玩家罢工造成的).