R ddply rollingmean 帮助:需要通过唯一 ID 捕获滚动平均值

R ddply rollingmean help: Need to capture rolling mean by Unique ID

我正在努力使用 ddply 获得所需的输出。我相信我在正确的轨道上,但我认为我无法从循环中输出数据,在循环中...
示例数据:

Player, Career_Game, Date, ERA, Pitches

Gio Gonzalez, 176,  Aug 1,  3.0,    86

Gio Gonzalez, 177,  Aug 5,  4.01,   89

Gio Gonzalez, 178,  Aug 10, 4,  11

Gio Gonzalez, 179,  Aug 16, 4.06,   102

Gio Gonzalez, 180,  Aug 21, 3.83,   97

...............

Jordan Zimmermann,  114,    Apr 4,  1.8,    81

Jordan Zimmermann,  115,    Apr 9,  8.1,    57

Jordan Zimmermann,  116,    Apr 14, 5.27,   93

Jordan Zimmermann,  117,    Apr 19, 3.92,   100

..............

我将这个数据框称为 BB。

所以我想要完成的是我想获得之前的平均值,假设每个玩家在每个实例中进行 5 场比赛......例如到目前为止我有下面的代码....

Pitchers_5 = data.frame(ddply(BB, ~Player, tail, n=5, numcolwise(mean)))

这成功计算了玩家的前五场比赛(Career_Games 176 到 180)。但是,我想获得每次观察的平均值。因此,对于 career_game 177,代码将计算第 172 到 176 场比赛的平均值,然后吐出具有前 5 场比赛平均值的 177 的实例,然后继续计算实例 178,并重新计算前 5 场比赛,依此类推在...所以使用上面的数据,一旦代码到达 Gio Gonzalez 的第 181 场职业比赛,它看起来像这样(前 5 场比赛的平均值)

Gio Gonzalez, 178,  Date (Not necessary),   3.78,   77

更新:指标评论让我研究了 zoo 包的 rollmean 函数。从那以后,我阅读了一些与我的问题类似的帖子和答案,但我正在寻找进一步的指导 (Rolling mean (moving average) by group/id with dplyr)。这个 link 解决了一个与我的非常相似的问题,除了 2 个区域。它通过一个唯一的 ID 计算血压的滚动平均值到一个新的领域,我想计算许多领域的滚动平均值。它还将血压观察纳入其平均计算。例如,我正在寻找....
如果我要计算 Gio Gonzalez 第 180 场比赛的滚动平均值,我会想要第 175 到 179 场比赛的平均值。不包括第 180 场比赛的结果。

谢谢!

假设您想要 ERAPitches 的滚动平均值,并且由于样本数据集的大小,使用 3 而不是 5 进行说明:

library(plyr)
library(zoo)

cbind(BB, ddply(BB, ~ Player, 
  function(x) rollapply(x[c("ERA", "Pitches")], list(-(1:3)), mean, fill = NA)))[-6]

给予:

             Player Career_Game   Date  ERA Pitches    ERA.1 Pitches.1
1      Gio Gonzalez         176  Aug 1 3.00      86       NA        NA
2      Gio Gonzalez         177  Aug 5 4.01      89       NA        NA
3      Gio Gonzalez         178 Aug 10 4.00      11       NA        NA
4      Gio Gonzalez         179 Aug 16 4.06     102 3.670000  62.00000
5      Gio Gonzalez         180 Aug 21 3.83      97 4.023333  67.33333
6 Jordan Zimmermann         114  Apr 4 1.80      81       NA        NA
7 Jordan Zimmermann         115  Apr 9 8.10      57       NA        NA
8 Jordan Zimmermann         116 Apr 14 5.27      93       NA        NA
9 Jordan Zimmermann         117 Apr 19 3.92     100 5.056667  77.00000

如果某些组可能少于 4 行,则使用它。如果有一行它 returns NAs。如果少于 4 行,它会减少 k,这样它仍然是 returns。

f <- function(x) {
    x <- as.matrix(x[c("ERA", "Pitches")])
    k <- min(3, nrow(x)-1)
    if (k) rollapply(x, list(-(1:k)), mean, fill = NA) else NA * x
}

cbind(BB, ddply(BB, ~ Player, f))[-6]

注意:我们使用了这个输入:

Lines <- "Player, Career_Game, Date, ERA, Pitches
Gio Gonzalez, 176,  Aug 1,  3.0,    86
Gio Gonzalez, 177,  Aug 5,  4.01,   89
Gio Gonzalez, 178,  Aug 10, 4,  11
Gio Gonzalez, 179,  Aug 16, 4.06,   102
Gio Gonzalez, 180,  Aug 21, 3.83,   97
Jordan Zimmermann,  114,    Apr 4,  1.8,    81
Jordan Zimmermann,  115,    Apr 9,  8.1,    57
Jordan Zimmermann,  116,    Apr 14, 5.27,   93
Jordan Zimmermann,  117,    Apr 19, 3.92,   100"

BB <- read.csv(text = Lines, strip.white = TRUE, as.is = TRUE)

已更新 以按要求使用 plyr。还添加了处理小组的变体。