0

我在 R 中找到了很多关于条件累积和的问题和答案,但到目前为止,我所看到的所有问题和答案都涉及对单个变量进行条件求和。

我想要做的是概括条件和公式,以便它可以在多个列中循环。我有一个包含历史 NFL 比赛数据的巨大数据框(大约 2500 行 x 136 列)。每个团队赛季有 16 行,每场比赛大约有 130 个变量。

我想计算每个统计类别的逐周(年初至今)累积平均值,最终目的是计算每支球队相对于整个联盟的每周 z 分数。

这是一个使用ddply为单个变量完成此任务的包的示例(在本例中为进攻性第二节得分):

ddply(test.data, "TeamSeason", transform, Cum.Mean = cumsum(O2QPt) / Week)

如何在不使用for循环的情况下遍历所有统计类别列?如果我必须使用for循环,有没有办法通过数字 ID 而不是标签来引用列?


下面的代码让我非常接近我想去的地方。感谢 Max Ghenis为我指明了正确的方向。

testdata.dt[order(UGID)][, lapply(.SD, cumsum), by="TeamSeason", .SDcols=numerics]

然而,虽然数据以正确的 UGID(唯一游戏 ID)顺序列出,但 UGID 值并未输出。如何在输出中包含此列,以便跟踪表中的游戏 ID?

4

1 回答 1

1

我推荐这个data.table包,因为您可以lapply在一个步骤中跨多个变量执行相同的功能。这是一个例子:

mtcars.dt <- data.table(mtcars)
# Grab cumsum of mpg only
mtcars.dt[, cumsum(mpg)]
# cumsum of mpg and hp
mtcars.dt[, lapply(.SD, cumsum), .SDcols=c("mpg", "hp")]
# cumsum of mpg and hp, ordered by mpg and split by cyl
mtcars.dt[order(mpg)][, lapply(.SD, cumsum), by="cyl", .SDcols=c("mpg", "hp")]

# Omitting .SDcols results in cumsum of all columns
mtcars.dt[, lapply(.SD, cumsum)]
# Nonnumeric columns cause issues though, e.g.:
mtcars.dt[, dummy.text:="text"] # Add character column
mtcars.dt[, lapply(.SD, cumsum)] # Warning, but would be error with sum
# Solution 1: Remove the column
mtcars.dt[, !c("dummy.text"), with=F][, lapply(.SD, cumsum)]
# Solution 2: Specify .SDcols as all numeric columns
numerics <- which(sapply(mtcars.dt, is.numeric))
mtcars.dt[, lapply(.SD, cumsum), .SDcols=numerics]
于 2013-11-02T06:45:43.260 回答