R中多列的通用/循环条件累积和算法

时间:2013-11-02 03:43:09

标签: r cumsum

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

我要做的是概括条件和公式,以便它可以在多个列中循环。我有一个巨大的数据框(大约2500行乘136列),包含历史NFL游戏数据。每个球队赛季有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?

1 个答案:

答案 0 :(得分: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]