在R中跨多个列推广/循环条件累积和算法

在R中跨多个列推广/循环条件累积和算法,r,cumsum,R,Cumsum,我发现了很多关于R中条件累积和的问题和答案,但到目前为止,我所看到的所有问题和答案都涉及到对单个变量的条件求和 我想做的是推广条件和公式,这样它就可以在多个列之间循环。我有一个巨大的数据框(大约2500行136列)包含历史NFL比赛数据。每个队赛季有16排,每场比赛大约有130个变量 我想计算每个统计类别每周(年初至今)的累积平均值,最终目的是计算每个球队相对于整个联赛的每周z分数 下面是一个使用ddply包的示例,该包针对单个变量完成此任务(在本例中为进攻性第二季度得分): 如何在不使用for

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

我想做的是推广条件和公式,这样它就可以在多个列之间循环。我有一个巨大的数据框(大约2500行136列)包含历史NFL比赛数据。每个队赛季有16排,每场比赛大约有130个变量

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

下面是一个使用
ddply
包的示例,该包针对单个变量完成此任务(在本例中为进攻性第二季度得分):

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


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

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

但是,尽管数据以适当的UGID(唯一游戏ID)顺序列出,但UGID值不会输出。如何在输出中包含此列,以便跟踪表中的游戏ID?

我建议使用
data.table
包,因为您可以使用
lappy
在一个步骤中跨多个变量执行相同的功能。下面是一个例子:

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]

mtcars.dt您没有描述“条件”的特征。通过提供代码来定义“每个统计类别”的含义。我刚才注意到了这个评论。我来自命令式编程背景,这也是我努力解决这个问题的原因之一。你能更好地描述条件吗?谢谢你的迅速回答。我是否明白我必须显式地命名我想要应用函数的所有变量?没有办法简单地告诉函数将自身应用于所有列吗?可以省略.SDcols参数来实现这一点;编辑答案以提供一些选项。我为反应缓慢而道歉。我在业余时间做这个项目。我仔细研究了你给出的例子,我想做的似乎是这两种情况的混合。为了使用您的术语,我想对mpg订购并按cyl拆分的mtcars数据集中的所有(后续)列求和。如果不清楚,我可以提供一些示例数据,以澄清这种情况。我很感激你在我处理这件事时的耐心。
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]