2009-10-03 19 views
8

Weźmy następujący kod:przekształcania macierzy list do regularnej matrycy

foo <- list() 
foo[[1]] <- list(a=1, b=2) 
foo[[2]] <- list(a=11, b=22) 
foo[[3]] <- list(a=111, b=222) 
result <- do.call(rbind, foo) 
result[,'a'] 

W tym przypadku result[,'a'] pokazuje listę. Czy istnieje bardziej elegancki sposób, taki, że result jest "regularną" matrycą wektorów? Wyobrażam sobie, że istnieją ręczne sposoby radzenia sobie z tym, ale zastanawiałem się, czy był oczywisty krok, którego mi brakowało.

Odpowiedz

9

do.call na listach jest bardzo elegancki i szybki. W rzeczywistości do.call (rbind, my.list) kiedyś uratował mi tyłek, kiedy musiałem połączyć ogromną listę. Było to zdecydowanie najszybsze rozwiązanie.

Aby rozwiązać problem, może coś takiego:

do.call(rbind, lapply(foo, unlist)) 


> result.2 <- do.call(rbind, lapply(foo, unlist)) 
> result.2 
     a b 
[1,] 1 2 
[2,] 11 22 
[3,] 111 222 
> result.2[, 'a'] 
[1] 1 11 111 
> 
+1

życzę 'do.call' +' rbind' był szybki. Czy kiedykolwiek próbowałeś używać go z 10 000 ramek danych na liście ?! – hadley

+0

@hadley: Wydaje mi się, że pamiętam, ucząc się w klasie statystyk obliczeniowych, że był to najszybszy sposób na wiązanie list (po wielu innych nieudanych próbach). Może pamiętam coś niewłaściwego. Co jest szybsze? – Vince

+2

Możesz zarządzać o około 4 razy szybciej, jeśli dokładnie napiszesz to sam. 'rbind.fill' w następnym wydaniu plyr będzie zawierał moje najlepsze starania. – hadley

1

Jednym z możliwych rozwiązań jest następujący (ale jestem zainteresowany alternatywy):

new.result <- matrix(unlist(result), ncol=ncol(result), 
       dimnames=list(NULL, colnames(result))) 
Powiązane problemy