我有这个来自GameDay服务器的击球数据数据集:
eliasID teamID gameID gameDate h hr bb so rbi ab runs t d lob sb cs sf hbp
1 430203 kca 2010/04/01/arimlb-kcamlb-1 4/1/2010 1 2 0 0 0 0 0 0 0 0
2 459714 kca 2010/04/01/arimlb-kcamlb-1 4/1/2010 1 0 0 1 0 3 1 0 0 1 0 0 0 0
3 325392 kca 2010/04/01/arimlb-kcamlb-1 4/1/2010 0 0 1 0 0 1 0 0 0 0 0 0 0 0
4 429801 kca 2010/04/01/arimlb-kcamlb-1 4/1/2010 0 0 0 1 0 3 0 0 0 2 0 0 0 0
5 456714 kca 2010/04/01/arimlb-kcamlb-1 4/1/2010 0 0 1 0 0 4 0 0 0 2 0 0 0 0
6 150449 kca 2010/04/01/arimlb-kcamlb-1 4/1/2010 0 0 0 1 1 4 0 0 0 2 0 0 0 0
ba ID gameDateFormat year Year
1 0.345 1 2010-04-01 2010 NA
2 0.250 2 2010-04-01 2010 NA
3 0.319 3 2010-04-01 2010 NA
4 0.327 4 2010-04-01 2010 NA
5 0.333 5 2010-04-01 2010 NA
6 0.217 6 2010-04-01 2010 NA
我的问题是我想为每场比赛建立一个总计的击球次数(ab),但总共只有那些比赛游戏日数低于行的gameDate的游戏,以及同一游戏中的游戏年份。
我看过for循环和dplyr已被建议,但是这些都想要为一个玩家加上所有ab列,当我需要为每个游戏添加一个持续的金额来显示玩家的年度总数到目前为止那场比赛。
我正在尝试构建您在baseball-ref.com上看到的那种统计数据。
用英语,我在寻找:
对于每个EliasID,击球中的gameID: 对于EliasID的总和(ab),其中gameDate<这一行的gameDate和gameYear =这一行的gameYear
您怎么看?
答案 0 :(得分:1)
欢迎来到R编程。因为您没有提供完整的样本数据(即dput()
而不仅仅是print()
,所以这个答案做了几个假设:
data.frame
被称为df
。您可以将此名称替换为实际名称。gameDate
是一个实际的日期向量,而不仅仅是一个字符串向量。如果是字符串,请将其更改为df$gameDate <- as.Date(df$gameDate, format = "%m/%d/%Y")
看来你想要的是一个&#34;累积和滞后,按组。&#34; (我建议你把它作为你的标题,以明确这是你想要的。)让我们看看这两个部分。
正如this answer中所建议的,将{1}的延迟引入cumsum()
的简单方法是将矢量x1, x2, ... xn
替换为0, x1, x2, ... xn-1
。因此:
cumsumLag1 <- function(x){
cumsum(c(0, head(x, n = -1))) # see ?cumsum and ?head, particularly the note on negative n
}
# test it out on first 5 counting numbers
cumsumLag1(1:5) # returns: 0 1 3 6 10
您的数据集应按累计函数的正确时间顺序排列。所以你可以用?order
做点什么:
df <- df[order(df$gameDate)]
但我们会在arrange()
中使用dplyr
(见下文)来保持简单。
有many ways按组进行求和(和类似的功能)。最简单的语法可能是%>% group_by(thing)
中的dplyr
。您希望按年份分组,也许还有其他变量(可能是teamId或playerId)。 你问题中一个非常不明确的部分是你要分组的内容,所以请关注这里的概念。第一个挑战是你没有{{{ 1}}变量,有很多方法可以做到这一点。让我们做这样的事情:
year
使用连锁运营商df$gameYear <- as.POSIXlt(df$gameDate)$year + 1900 # see ?POSIXlt for more details
,我们只是对我们已经审核过的内容进行排序。
%>%