2013-10-18 19 views
6

Ich habe eine Reihe von Datenrahmen, df1df2, wobei jeder Datenrahmen dieser Struktur folgen:Looping durch Liste von Datenrahmen in R

x <- c(1:5) 
y <- c(1:5) 
df1 <- data.frame("Row One"=x, "Row Two"=y) 

Beispielausgabe für df1:

Row.One Row.Two 
    1   1 
    2   2 
    3   3 
    4   4 
    5   5 

I setze jeden Datenrahmen in eine Liste dfList <- list(df1,df2...)

Jetzt möchte ich jedes Datenrahmenobjekt in dieser Liste wiederholen, um die Spaltennamen usin zu ersetzen g dieser Befehl:

a <- grep("One", colnames(df)) 
b <- grep("Two", colnames(df)) 

names(df)[a] <- "R1" 
names(df)[b] <- "R2" 

Wie kann ich eine Schleife in R-Struktur, so dass ich, egal wie viele Datenrahmen in der Liste sind, wird die Spaltennamen-Objekt Befehle über Wechsel in jeden Datenrahmen angewandt werden?

Antwort

6
> df1 <- data.frame("Row One"=x, "Row Two"=y) 
> df2 <- data.frame("Row Two"=y,"Row One"=x) 
> dfList <- list(df1,df2) 
> lapply(dfList, function(x) { 
        names(x)[ grep("One", names(x))] <- "R1" 
        names(x)[ grep("Two", names(x))] <- "R2" 
        x}) 
[[1]] 
    R1 R2 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 

[[2]] 
    R2 R1 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
+0

Das funktioniert gut, aber wenn ich 'dflist [[1]]' 'rufe, wird immer noch" Row One "anstelle von" R1 "angezeigt. Warum erscheint die Änderung nur auf der Konsole, wenn ich den 'lapply'-Befehl ausführe, aber den Datenrahmen selbst nicht aktualisiere? Mache ich etwas falsch? – AME

+1

Wenn Sie das Ergebnis einem benannten Objekt nicht zuordnen, verschwindet es. Wenn Sie dfList ersetzen möchten, müssen Sie 'dfList <-' verwenden. –

4

Verwenden Sie einfach length(dfList)?

for(i in 1:length(dfList)) 
{ 
    a <- grep("One", names(dfList[[i]])) 
    ... #etc. 
} 

Mit lapply wird schneller.

ChangeNames = function(Data) 
{ 
    a = grep("One", names(Data)) 
    b = grep("Two", names(Data)) 
    names(Data)[c(a,b)] <- c("R1", "R2") 
    return(Data) 
} 
lapply(dfList, ChangeNames) #Returns list of renamed data frames. 
+0

Gilt das auch funktionieren, wenn "a" leer ist? Es scheint, als würde es "R1" zu "b" zuweisen. – Frank

+0

Nein, tut es nicht. OP möchte nur, dass dieser Befehl auf jeden Datenrahmen in der Liste angewendet wird. –

+0

Okay. Ich bin daran gewöhnt, grep als eine bedingte Sache zu sehen ("Wenn ich einen Ausdruck finde ..."), aber, ja, der OP scheint zu wissen, dass es für jeden einen Treffer geben wird. – Frank

3

Oder nutzen llply (von plyr) oder lapply wie so:

library(plyr) 
result_list <- llply(list_of_df, function(x) { 
       # do the replacing 
       return(x) 
       })