我正努力使用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的平均值,然后吐出一个实例,其中177具有前5个游戏的平均值,然后继续实例178,并重新计算前5个游戏,依此类推......所以使用上面的数据,一旦代码进入Gio Gonzalez 181职业生涯的游戏,它就会像这样(前5场比赛的平均值)
Gio Gonzalez, 178, Date (Not necessary), 3.78, 77
更新:度量标准让我看到了动物园软件包的rollmean功能。我已经阅读了一些类似于我的问题的帖子和答案,但我正在寻找进一步的指导(Rolling mean (moving average) by group/id with dplyr)。这个链接解决了一个非常类似的问题,除了2个区域。它通过一个唯一的ID计算血压的滚动平均值到一个新的领域,我想计算许多领域的滚动平均值。它还包括将血压观察到其平均值计算中。例如,我正在寻找....
如果我要计算Gio Gonzalez第180场比赛的滚动方式,我会想要175比17的平均值。不包括第180场比赛结果。
谢谢!
答案 0 :(得分:1)
假设您希望滚动均值为ERA
和Pitches
,并且由于样本数据集的大小而使用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行,则使用此行。如果有一行则返回NA。如果少于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]
注意:我们使用了这个输入:
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。还添加了处理小组的变体。