簡體   English   中英

R中多列的泛化/循環條件累積和算法

[英]Generalizing/looping conditional cumulative sum algorithm across multiple columns in R

我發現了很多有關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?

我建議使用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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM