2013-06-10 4 views
23

Ich habe eine Liste von Datenrahmen anzuwenden und jedes Element in der Liste (zB jeden Datenrahmen) einen Namen gegeben:lapply Mit Hilfe eine Funktion über die Liste von Datenrahmen und Speichern von Ausgabe-Dateien mit unterschiedlichen Namen

z.B

df1 <- data.frame(x = c(1:5), y = c(11:15)) 
df2 <- data.frame(x = c(1:5), y = c(11:15)) 
mylist <- list(A = df1, B = df2) 

Ich habe eine Funktion, die ich auf jeden Datenrahmen anwenden möchte; In dieser Funktion möchte ich eine Zeile einschließen, um die Ergebnisse in Datei zu schreiben (schließlich möchte ich kompliziertere Dinge wie die Diagramme für die Korrelation zwischen zwei Variablen für jeden Datenrahmen machen, aber ich würde einfach anfangen)

z.B

NewVar <- function(mydata, whichVar, i) { 
mydata$newVar <- mydata[, whichVar] + 1 
write.csv(mydata, file = i) 
} 

Ich möchte lapply() verwenden, um diese Funktion zu jedem Datenrahmen

so etwas wie in meiner Liste anwenden:

hh<-lapply(mylist, NewVar, whichVar = "y") 

ich herausfinden kann, nicht, wie das "i" zuweisen im Kontext von lapply, so dass i iteriert über die Namen in der Liste der Datenrahmen, Speichern mehrerer Dateien mit unterschiedlichen Namen (in diesem Fall, zwei Dateien mit den Namen A und B), die mit dem modifizierten da entsprechen ta Rahmen.

+1

Ich weiß, Sie sagen Sie versuchen, mit einem for-Schleife zu vermeiden aber ich denke, es ist richtig, in diesem Fall eine for-Schleife zu verwenden. Ich mag es nicht, 'lapply()' zu verwenden, wenn nichts zurückgegeben wird. Etwas wie 'l_ply()' aus dem 'plyr'-Paket ist wahrscheinlich geeigneter. Oder nur eine For-Schleife. – MadScone

Antwort

7

Es wird mit dem folgenden lapply Aufruf arbeiten:

lapply(names(mylist), function(x) NewVar(mylist[[x]], "y", x)) 
11

Es gibt viele Möglichkeiten. Zum Beispiel:

lapply(names(mylist), 
     function(x)write.csv(mylist[x], 
           file =paste0(x,'.csv'))) 

oder mit Indizes:

lapply(seq_along(mylist), 
    function(i)write.csv(mylist[i], 
          file =paste0(names(mylist)[i],'.csv'))) 
+0

Danke für die Antwort ... Allerdings habe ich beide Optionen ausprobiert und sie scheinen nicht für eine Funktion zu funktionieren, die außerhalb des Befehls lapply definiert ist. Meine eigentliche Funktion muss eine Reihe von Analysen durchführen und dann alle Ergebnisse speichern, also keine Möglichkeit, sie in einer Zeile zu definieren. – user2414840