2012-07-18 37 views
1

除「嵌套」部分外,我的問題標題幾乎與dlplyplyr包)描述相匹配。拆分數據框,應用函數並將結果返回到嵌套列表中

讓我用一個例子解釋:

library(plyr) 
res <- dlply(mtcars, c("gear", "carb"), identity) 
head(res, 2) 
# $`3.1` 
#     mpg cyl disp hp drat wt qsec vs am gear carb 
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
# Valiant  18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
# Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 
# 
# $`3.2` 
#     mpg cyl disp hp drat wt qsec vs am gear carb 
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
# Dodge Challenger 15.5 8 318 150 2.76 3.520 16.87 0 0 3 2 
# AMC Javelin  15.2 8 304 150 3.15 3.435 17.30 0 0 3 2 
# Pontiac Firebird 19.2 8 400 175 3.08 3.845 17.05 0 0 3 2 

正如你可以看到,輸出是一個列表,其中的名稱(鍵)是我用來拆分數據的兩個變量的串聯,例如"3.1"(gear = 3, carb = 1)的關鍵。

相反,我想我的結果是一個嵌套列表,因此可以通過兩組鍵來訪問這些元素,其中一個用於我的每個拆分變量:res[["3"][["1"]]

有沒有什麼東西,不一定來自plyr包,那可以做到這一點?我想這個答案可以推廣到任意數量的分裂變量。另外,儘管我的示例使用了函數,但我可以應用任何函數,這一點很重要,從而導致僅僅分割數據。謝謝你的建議。

回答

3

我一個解決方案來了我自己,它使用遞歸:

nested.dlply <- function(df, by, fun, ...) { 

    require(plyr) 

    if (length(by) == 1) { 
     dlply(df, by, fun, ...) 
    } else { 
     dlply(df, by[1], nested.dlply, by[-1], fun, ...) 
    } 
} 

這裏有幾個例子:

nested.dlply(mtcars, c("gear", "carb"), identity) 
# $`3` 
# $`3`$`1` 
#      mpg cyl disp hp drat wt qsec vs am gear carb 
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
# Valiant  18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
# Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 
# 
# $`3`$`2` 
#     mpg cyl disp hp drat wt qsec vs am gear carb 
# Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 
# Dodge Challenger 15.5 8 318 150 2.76 3.520 16.87 0 0 3 2 
# AMC Javelin  15.2 8 304 150 3.15 3.435 17.30 0 0 3 2 
# Pontiac Firebird 19.2 8 400 175 3.08 3.845 17.05 0 0 3 2 
# [...] 

nested.dlply(mtcars, c("gear", "carb"), head, 2) 
# $`3` 
# $`3`$`1` 
#     mpg cyl disp hp drat wt qsec vs am gear carb 
# Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 
# Valiant  18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 
# 
# $`3`$`2` 
#     mpg cyl disp hp drat wt qsec vs am gear carb 
# Hornet Sportabout 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2 
# Dodge Challenger 15.5 8 318 150 2.76 3.52 16.87 0 0 3 2 
# [...] 

我懷疑這是非常有效的,但它的工作。我仍然歡迎你的建議。理想情況下,我希望一些包已經實現了它。

+2

我不確定你是否看到[這篇文章](http://stackoverflow.com/q/7247108/1270695),但Brian Diggs提供了'plyr'解決方案:'dlply(mtcars,。(gear), (碳水化合物))等等,以獲得更多的嵌套。正如在這個問題上所討論的那樣,這樣的嵌套數據結構可能不是最方便的工作。 – A5C1D2H2I1M1N2O1R2T1 2012-07-18 16:55:27

+0

謝謝@mrdwab。我認爲推廣Brian Diggs所建議的嵌套'dlply'調用的唯一方法就是像上面那樣使用遞歸。您提供的鏈接確實幫助我縮短了代碼(編輯過)。 – flodel 2012-07-19 01:31:35

2

怎麼樣嵌套split

temp = lapply(split(mtcars, mtcars$gear), function(x) split(x, x$carb)) 
temp[["3"]]["1"] 
# $`1` 
#     mpg cyl disp hp drat wt qsec vs am gear carb 
# Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 
# Valiant  18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 
# Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1 
+0

謝謝,但它並不完全解決我的問題,閱讀我的問題的結束:我需要它泛化爲任何數量的拆分變量(不只是兩個),它需要應用一個函數(不只是做一個分裂)。 – flodel 2012-07-18 12:32:14

相關問題