2013-07-31 29 views
4

我有一個嵌套列表,其基本元素是數據幀,我想遍歷這個列表遞歸地做一些計算每個數據幀,最後得到一個嵌套列表的結果與輸入相同的結構。我知道「rapply」正是爲了這樣的任務,但是我遇到了一個問題,rapply實際上比我想要的更深入,即它分解每個數據幀並將其應用於每列(因爲數據框本身就是一個列表在R中)。rapply到嵌套列表中的數據幀R

我能想到的一種解決方法是將每個數據幀轉換爲矩陣,但它會強制統一數據類型,所以我不太喜歡它。我想知道是否有任何方法來控制rapply的遞歸深度。任何想法?謝謝。

+1

您可能需要在'rapply'函數中指定'classes =「data.frame」'? – DrDom

+0

嗨@DrDom,我試着指定'classes =「data.frame」'但沒有成功。不管怎樣,謝謝。 – foehn

回答

5

1.在原包裝

在創建表結構儘量包裹在原對象中的數據幀:

library(proto) 
L <- list(a = proto(DF = BOD), b = proto(DF = BOD)) 
rapply(L, f = function(.) colSums(.$DF), how = "replace") 

捐贈:

$a 
    Time demand 
    22  89 

$b 
    Time demand 
    22  89 

總結的結果你如果你想進一步rapply it;

f <- function(.) proto(result = colSums(.$DF)) 
out <- rapply(L, f = f, how = "replace") 
str(out) 

,並提供:

List of 2 
$ a:proto object 
.. $ result: Named num [1:2] 22 89 
.. ..- attr(*, "names")= chr [1:2] "Time" "demand" 
$ b:proto object 
.. $ result: Named num [1:2] 22 89 
.. ..- attr(*, "names")= chr [1:2] "Time" "demand" 

2.寫你自己的rapply替代

recurse <- function (L, f) { 
    if (inherits(L, "data.frame")) f(L) 
    else lapply(L, recurse, f) 
} 

L <- list(a = BOD, b = BOD) 
recurse(L, colSums) 

這給:

$a 
    Time demand 
    22  89 

$b 
    Time demand 
    22  89 

新增:第二approa ch