2014-05-20 11 views
10

Ich habe eine Reihe von Listen mit Listen in ihnen (verallgemeinerte lineare Modellausgabe). Ich möchte eine Funktion schreiben, die aus jeder Liste mehrere Elemente extrahiert und die Ergebnisse dann zu einem Datenrahmen zusammenfasst.Wie kann ich Elemente aus Listen von Listen in R extrahieren?

Ich möchte modelset[[1]]$likelihood & modelset[[1]]$fixef, modelset[[2]]$likelihood & modelset[[2]]$fixef, etc, extrahieren und die Ergebnisse in einem Datenrahmen zu kombinieren.

Kann mir jemand eine Idee geben, wie man das macht?

Entschuldigung, wenn meine Frage verwirrend ist: Was ich versuche zu tun, ist jenseits meines begrenzten Programmierverständnisses.

Weitere Informationen zu meiner Liste:

modelset: Large list (16 elements, 7.3Mb) 
    :List of 29 
    ..$ fixef   : Named num [1:2] -1.236 -0.611 
    .. ..- attr(*, "names")= chr [1:2] "(Intercept)" "SMIstd" 
    ..$ likelihood  :List of 4 
    .. ..$ hlik: num 238 
    .. ..$ pvh : num 256 
    .. ..$ pbvh: num 260 
    .. ..$ cAIC: num 567 

    ...etc 
+1

'lapply (modelset," [["," likelihood ")' etc ... –

Antwort

29

Um dies zu lösen elegant müssen Sie verstehen, dass Sie ['…'] statt $… verwenden können, um Listenelemente zugreifen (aber Sie werden eine Liste zurück, anstatt eine bekommen einzelnes Element).

Also, wenn Sie die Elemente likelihood und fixef erhalten möchten, können Sie schreiben:

modelset[[1]][c('likelihood', 'fixef')] 

Jetzt Sie, dass für jedes Element in modelset tun wollen. Das ist, was lapply tut:

lapply(modelset, function (x) x[c('likelihood', 'fixef')]) 

Dies funktioniert, aber es ist nicht sehr R-like.

Sie sehen, in R, fast alles ist eine Funktion. […] ruft eine Funktion namens [ (aber seit [ ist ein besonderes Symbol für R, in muss in Backticks zitiert werden: `[`). So können Sie stattdessen das schreiben:

lapply(modelset, function (x) `[`(c('likelihood', 'fixef')]) 

Wow, das ist überhaupt nicht sehr lesbar. Allerdings können wir jetzt die Verpackung anonym function (x), entfernen, da im Inneren sind wir einfach eine andere Funktion aufrufen, und bewegen Sie die zusätzlichen Argumente für den letzten Parameter lapply:

lapply(modelset, `[`, c('likelihood', 'fixef')) 

Das funktioniert und ist elegant R-Code.


Lassen Sie uns zurücktreten und überprüfen, was wir hier getan haben. In der Tat hatten wir einen Ausdruck, der so aussah:

lapply(some_list, function (x) f(x, y)) 

Und dieser Aufruf statt als

lapply(some_list, f, y) 

geschrieben Wir haben genau das, mit somelist = modelset, f = `[` und y = c('likelihood', 'fixef').

+3

Es ist nicht einfach, solche didatic Antwort wie diese zu finden. Vielen Dank. –

+0

Vielen Dank für Ihre sehr hilfreiche Antwort und Erklärung. – Akos

Verwandte Themen