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

R ddply rollingmean帮助:需要通过唯一ID捕获滚动平均值,r,loops,plyr,R,Loops,Plyr,我正在努力使用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,

我正在努力使用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)))
这成功地为玩家计算了前五场游戏(职业生涯游戏176到180)。然而,我想得到每次观察的平均值。因此,对于career_游戏177,代码将计算游戏172到176的平均值,然后给出一个177的实例,该实例具有前5个游戏的平均值,然后继续实例178,并重新计算前5个游戏,依此类推。。。因此,使用上面的数据,一旦代码进入Gio Gonzalez第181场职业赛,它看起来是这样的(前5场比赛的平均值)


更新:Metrics评论让我研究了zoo包的rollmean函数。我已经阅读了一些与我的问题类似的帖子和答案,但是我正在寻找进一步的指导()。这个链接解决了一个非常类似于我的问题,除了在两个方面。它通过一个唯一的ID将血压的滚动平均值计算到一个新字段中,我想在这里计算许多字段的滚动平均值。它还将血压观测纳入其平均值计算。例如,我正在寻找……
如果我要计算吉奥·冈萨雷斯第180场比赛的滚动平均值,我想要第175场到第179场比赛的平均值。不包括第180场比赛的结果


谢谢

假设您需要
ERA
pitchs
的滚动平均值,并且由于样本数据集的大小,使用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行,则使用此选项。如果有一行,则返回NAs。如果少于4行,它会减少
k
,这样它仍然会返回一些内容

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]

f您可以从zoo软件包中看到
rollmean
。感谢metrics,rollmean具有我正在寻找的功能,并将我带到了这篇与我非常相似的帖子。()但是我仍在寻求帮助,在上面发布的链接中,此人希望将ID的血压滚动平均值添加到一个新字段中。在我的示例中,我试图捕获相同的内容,但我希望滚动平均值应用于我的数据框中的所有数字字段。如果添加示例数据集以及该数据集所需的结果,您更有可能得到答案。谢谢Grothendieck!这是非常接近我要找的。唯一的补充是不将当前值包括在滚动平均值函数中(可能会混淆)。让我解释一下,如果你看一下你生成的Gio Gonzalez第180场职业游戏时代的滚动平均值输出(3.963333),这包括职业游戏178、179和180((4.00+4.06+3.83)/3=3.96333)的滚动平均值计算。然而,我希望职业生涯游戏177、178和179((4.01+4.00+4.06)/3=4.023)被添加到ERA。职业生涯游戏180的1。这有意义吗?这可以通过两种方式解决。。。以某种方式让rollmean忽略或排除其当前迭代正在进行的career_游戏,或者只插入一行(即幻灯片),将新的rollmean输出向下一行,用于所有观察。谢谢你的帮助!好啊已修改为取相对位置-1、-2和-3中的值的平均值,即排除当前值。感谢这正是我所寻找的。添加了一个变量,如果组中有一行或如果有2或3行,则最后一行取前几行的平均值。如果需要不同的规则,请修改
f
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)