2016-07-08 9 views
0

Hier ist mein aktuelles Problem. Ich habe eine Liste von Datenrahmen, die aus verschiedenen Werten bestehen. Ich möchte in der Lage sein, durch die Liste von Datenrahmen zu iterieren und bestimmte Datenspalten für jeden Datenrahmen auszuwählen, basierend auf den Namen der Spalten, die ich spezifiziere. Ich möchte dann diese ausgewählten Spalten in einer separaten Liste von Datenrahmen zuweisen.Auswählen bestimmter Spalten in Datenrahmen eingebettet in einer Liste

Ich habe andere Listenobjekte verwendet, die aus den Namen der verschiedenen Spalten bestehen, die ich extrahieren möchte.

Ich habe einen Stich auf ein paar Ansätze genommen, aber ich bin immer noch auf der Kopf kratzen Bühne. Hilfe wäre willkommen!

Hier einige Beispiel-Code, den ich gekocht habe unten nach oben:

# Create sample data set of five data frames, 10 x 10 

M1 <- data.frame(matrix(rnorm(5), nrow = 10, ncol = 10)) 
M2 <- data.frame(matrix(rnorm(10), nrow = 10, ncol = 10)) 
M3 <- data.frame(matrix(rnorm(15), nrow = 10, ncol = 10)) 
M4 <- data.frame(matrix(rnorm(20), nrow = 10, ncol = 10)) 
M5 <- data.frame(matrix(rnorm(25), nrow = 10, ncol = 10)) 

# Assign data frames to a list object 

mlist<-list(M1, M2, M3, M4, M5) 

# Creates a data frame object consisting of the different column names I want to extract later 

df.names <- data.frame(One = c("X1", "X3", "X5"), Two = c("X2", "X4", "X6")) 

# Converts df.names into a set of characters (not sure if this is needed but it has worked for me in the past) 

df.char <- lapply(df.names, function(x) as.character(x[1:length(x)])) 

# Creates variable m that will be used to iterate in the for loops below 

m<-1:length(mlist) 



# Creates list object to set aside selected columns from df.names 

mlist.selected<-list() 

# A for loop to iterate for each of the df.names elements, and for each dataframe in mlist. *Hopefully* select out the columns of interest labeled in df.names, place into another list object for safe keeping 
for (i in 1:length(df.names)) 
     { 
     for(j in m) 
       { 
       #T his is the line of code I'm struggling with and I know it doesn't work. :-(
       mlist.selected[j]<-lapply(mlist, function(x) x[df.char[[i]]]) 

     } 
} 

Antwort

1

Mit

mlist.selected[[j]] <- lapply(mlist, function(x) x[df.char[[i]]]) 

in Ihrer for-Schleife erhalten Sie ein bisschen näher. Ich würde vorschlagen, eine benannte Liste mit

zu verwenden, um eine noch schönere Ausgabe zu erhalten.

Bei der Überprüfung gibt dies wiederholte Listen, die ich glaube nicht, dass Sie wollen. Wenn ich verstehe, was Sie zu tun versuchen, können Sie tatsächlich loswerden der inneren (j) Schleife:

# create named list of the data.frames 
mlist<-list("M1"=M1, "M2"=M2, "M3"=M3, "M4"=M4, "M5"=M5) 

# run the loop 
for (i in 1:length(df.names)) { 
    mlist.selected[[paste(names(df.names)[i], sep=".")]] <- 
               lapply(mlist, function(x) x[df.char[[i]]]) 
} 

, die eine schön benannte Liste gibt, mit zu arbeiten. Zum Beispiel können Sie auf die Daten der gespeicherten Vektoren von M2 in df.names$Two mit mlist.selected$Two$M2 zugreifen.

+0

I gefunden Vereinfachung der for-Schleife resultiert in der Ausgabe, die optimal ist für .... (i in 1: Länge (df.names)) { mlist.selected [[Paste ("m", i , Namen (df.name) [i], sep = ".")]] <- lapply (mlist, Funktion (x) x [df.char [[i]]]) } – mjtat

+0

Rechts. Das steht am Ende meiner Antwort. Ich habe sogar ein wenig hinzugefügt, um Ihnen die richtigen data.frame-Namen von mlist zu geben. Schau mal. – lmo

+0

Danke für die Hilfe! – mjtat

Verwandte Themen