2016-08-02 8 views
0

Ich habe eine Liste mit Listen wie folgt aus:Namensgebung und rbinding alle Elemente (dfs, Matrizen, Vektoren, etc.) aus den Listen der Liste

# output from a package function 
A <- list(a = matrix(1:9,ncol=3), 
      b = matrix(1:8,ncol=4), 
      c = 1.5) 

B <- list(a = matrix(11:19,ncol=3), 
      b = matrix(11:18,ncol=4), 
      c = 2.5) 

# list with all outputs (from loaded=lapply(filenames, function(x) get(load(x)))) 
superlist <- list(A, B)) 

Was ich zuerst tun möchte, ist den Namen hinzufügen jedes Listenelement (A, B) für alle Listenelemente zweiter Ordnung. Zum Beispiel würde B werden:

B <- list(a = cbind(matrix(11:19,ncol=3),c("B","B","B")), 
      b = cbind(matrix(11:18,ncol=4),c("B","B")), 
      c = c(2.5,"B")) 

Dann ist das Ziel, alle Matrizen, Werte oder Datenrahmen rbind (a, b, c) mit dem gleichen Namen zusammen, so dass ich hätte:

superlist <- list(a = rbind(cbind(matrix(1:9,ncol=3),c("A","A","A")),cbind(matrix(11:19,ncol=3),c("B","B","B"))), 
      b = rbind(cbind(matrix(1:8,ncol=4),c("A","A")),cbind(matrix(11:18,ncol=4),c("B","B"))), 
      c = rbind(c(1.5,"A"),c(2.5,"B"))) 

für das rbinding, das beste, was ich habe ist dies (von rbind all dataframes in a list of lists by name):

do.call("rbind",lapply(superlist ,function(x) x[["a"]])) 

es wird jedoch nur für ein Listenelement (und ich habe mehr als 20). Ich weiß, dass ich eine Schleife schreiben kann, aber da ich die Funktion oft benutzen werde, würde ich gerne wissen, wie man das besser macht.

Ich bin mir bewusst, dass mehrere Fragen dazu gestellt werden, aber keiner von ihnen hat genau das gleiche Problem (zum Beispiel einige haben nur Datenrahmen als Liste von Listenelementen, manchmal alle von der gleichen Größe). Obwohl einige Fragen hilfreich waren, gab mir keiner wirklich genügend Informationen, um mein Problem zu lösen.

Danke

+0

"Ich möchte zuerst den Namen jedes Listenelements (A, B) zu allen Listenelementen zweiter Ordnung hinzufügen." - Tu das nicht. Sie kontaminieren die Zahlen in Ihren Daten mit Zeichen aus den Namen, zB in 'cbind (Matrix (11: 19, ncol = 3), c (" B "," B "," B "))' – Frank

Antwort

0

denke, ich kann Nutzen Sie die in this vorgeschlagene Antwort. Es kehrt die Listenstruktur um, d. H. Gruppen nach innerer Liste. Ein Beispiel:

# output from a package function 
A <- list(a = matrix(1:9,ncol=3), 
     b = matrix(1:8,ncol=4), 
     c = 1.5) 

B <- list(a = matrix(11:19,ncol=3), 
     b = matrix(11:18,ncol=4), 
     c = 2.5) 

# list with all outputs (from loaded=lapply(filenames, function(x)  get(load(x)))) 
superlist <- list(A, B) 
################### your code above ############## 
## the function from the linked answer 
fun <- function(ll) { 
    nms <- unique(unlist(lapply(ll, function(X) names(X)))) 
    ll <- lapply(ll, function(X) setNames(X[nms], nms)) 
    ll <- apply(do.call(rbind, ll), 2, as.list) 
    lapply(ll, function(X) X[!sapply(X, is.null)]) 
} 

## apply the function to your list 
insideout <- fun(superlist) 

## rbind the components together 
lapply(insideout, function(x) do.call(rbind, x)) 

Ist das, was Sie vorhatten?

+0

Ja das funktioniert super! Aber wissen Sie auch, wie Sie eine Spalte mit Namen hinzufügen (der erste Teil meiner Frage)? Wie Frank sagt, "kontaminiert es meine Matrix, aber das interessiert mich nicht (für später ist die Kennzeichnung wichtiger als" Kontamination "). – Wave

+0

Nun, es kann keinen Weg geben, dies automatisch zu tun, wie die Namen" A "und" B "werden von Ihnen gewählt und stehen nicht mit Ihren Daten in Verbindung (zumindest in Ihrem Beispiel). Auch ich stimme Frank zu. Konvertieren Sie Ihre ganze Matrix in Zeichen, um Etiketten zu haben, ist wirklich schlecht. Verwenden Sie stattdessen Daten. Rahmen und fügen Sie eine Spalte für die Namen hinzu oder um rownames für die Matrix zu verwenden. – AEF