2013-07-13 8 views
9

Angenommen, es gibt viele Datenframes, die dieselbe Operation ausführen müssen. Beispiel:Wie kann R über Datenrahmen schleifen?

prefix <- c("Mrs.","Mrs.","Mr","Dr.","Mrs.","Mr.","Mrs.","Ms","Ms","Mr") 
measure <- rnorm(10) 
df1 <- data.frame(prefix,measure) 
df1$gender[df1$prefix=="Mrs."] <- "F" 

Erstellt eine Indikatorvariable namens Geschlecht, wenn der Wert in der angrenzenden Zeile "Frau" ist. Eine allgemeine Art und Weise zu Schleife über String-Variablen in R wurde von here mit der Funktion angepasst as.name() hinzugefügt, um die Zitate von „i“ zu entfernen:

dflist <- c("df1","df2","df3","df4","df5") 

for (i in dflist) { 
    as.name(i)$gender[as.name(i)$prefix=="Ms."] <- "F" 
    } 

Leider funktioniert das nicht. Irgendwelche Vorschläge?

Antwort

8

Setzen Sie alle Ihre Datenrahmen in eine Liste und dann loop/lapply über sie. Auf lange Sicht wird es dir viel leichter fallen. innerhalb von R-Funktionen

dfList <- list(df1=df1, df2=df2, ....) 

dfList <- lapply(dfList, function(df) { 
    df$gender[df$prefix == "Mrs."] <- "F" 
    df 
}) 

dfList$df1 
+0

danke, wie kann ich das neue extrahieren Datenrahmen aus der Liste dfList? –

+0

mit 'dfList [[1]]', etc. Ich werde den Beitrag bearbeiten, um zu zeigen, wie Sie sie mit Namen bekommen können –

2

Die einzige Instanz Beispiel wäre nicht wirklich ein Indikator im üblichen Sinne schaffen, da <NA> die Nicht- „F“ Werte wären und diese würden auch nicht funktionieren. Sowohl arithmetische Operationen als auch logische Operationen kehren zurück. Versuchen Sie dies stattdessen:

df1$gender <- ifelse(prefix %in% c("Mrs.", "Ms") , "probably F", 
       ifelse(prefix=="Dr.", "possibly F", # as is my wife. 
             "probably not F")) 

Dann folgen Sie @ HongDois Rat, Listen zu verwenden. Und vergessen Sie nicht, a) ein vollständiges Datenrahmenobjekt zurückzugeben und b) das Ergebnis einem Objektnamen zuzuordnen (die beide dargestellt, aber oft von R-newbs vergessen wurden).