2013-11-02 23 views
0

我已經在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?

+0

您尚未描述「條件」的功能。通過提供代碼來定義「每個統計類別」的含義。 –

+0

我剛纔注意到這個評論。我來自命令式的編程背景,這是我爲此而掙扎的原因之一。 For For循環更好地描述條件性? –

回答

0

我推薦使用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] 
+0

我很感謝您的及時答覆。我是否明白,我必須明確指定要應用該函數的所有變量?是否沒有辦法簡單地告訴函數將其應用於所有列? –

+0

您可以省略.SDcols參數來執行此操作;回答編輯給出一些選項。 –

+0

對於響應緩慢,我表示歉意。我正在空閒時間從事這個項目。我通過你給出的例子,我想要做的事情似乎是兩種情況的混合。要使用你的術語,我想cumsum *所有*(後續)mtcars數據集按mpg排序和拆分cyl。如果不清楚,我可以提供一些可能說明情況的樣本數據。我很感激你的耐心,因爲我正在努力解決這個問題。 –