2015-11-06 4 views
5

Ich versuche lapply auf einer Liste von Datenrahmen zu verwenden; aber ich versäume es, die Parameter richtig zu übergeben (denke ich).Verwenden von Lapply zum Ändern der Spaltennamen einer Liste von Datenrahmen

Liste der Datenrahmen:

df1 <- data.frame(A = 1:10, B= 11:20) 
df2 <- data.frame(A = 21:30, B = 31:40) 

listDF <- list(df1, df2,df3) #multiple data frames w. way less columns than the length of vector todos 

Vektor mit Spaltennamen:

todos <-c('col1','col2', ......'colN') 

Ich mag würde die Spaltennamen ändern lapply mit:

lapply (listDF, function(x) { colnames(x)[2:length(x)] <-todos[1:length(x)-1] } ) 

aber dieses doesn ändere die Namen überhaupt nicht. Übergebe ich die Datenframes nicht selbst, sondern etwas anderes? Ich möchte nur Namen ändern und das Ergebnis nicht an ein neues Objekt zurückgeben.

Vielen Dank im Voraus, p.

+0

würde wegen * R Berufung nicht arbeiten, indem sie Wert * – jogo

+1

Fügen Sie einfach ein 'X' bis zum Ende 'lapply (listDF, Funktion (x) {COLNAMES (x) [2: Länge (x)] < -todos [1: Länge (x) -1]; x}) '. Ihre geschriebene Funktion hat keinen Rückgabewert. –

+1

Nicht verwandt mit der Frage, aber ich denke, dass '1: length (x) -1' ist ein häufiger Fehler (manchmal nicht schädlich). Die rechte Zeile ist '1: (length (x) -1)' (Vorsicht!) – nicola

Antwort

11

Sie auch setNames verwenden können, wenn Sie alle Spalten

df1 <- data.frame(A = 1:10, B= 11:20) 
df2 <- data.frame(A = 21:30, B = 31:40) 

listDF <- list(df1, df2) 
new_col_name <- c("C", "D") 

lapply(listDF, setNames, nm = new_col_name) 
## [[1]] 
##  C D 
## 1 1 11 
## 2 2 12 
## 3 3 13 
## 4 4 14 
## 5 5 15 
## 6 6 16 
## 7 7 17 
## 8 8 18 
## 9 9 19 
## 10 10 20 

## [[2]] 
##  C D 
## 1 21 31 
## 2 22 32 
## 3 23 33 
## 4 24 34 
## 5 25 35 
## 6 26 36 
## 7 27 37 
## 8 28 38 
## 9 29 39 
## 10 30 40 

ersetzen möchten, wenn Sie nur einen Teil der Spaltennamen ersetzen müssen, dann können Sie verwenden, um die Lösung von @Jogo

lapply(listDF, function(df) { 
    names(df)[-1] <- new_col_name[-ncol(df)] 
    df 
}) 

ein letzter Punkt in R gibt es einen Unterschied zwischen a: b - 1 und a: (b - 1)

1:10 - 1 
## [1] 0 1 2 3 4 5 6 7 8 9 

1:(10 - 1) 
## [1] 1 2 3 4 5 6 7 8 9 

EDIT

Wenn Sie die Spaltennamen der data.frame in globalen Umfeld aus einer Liste ändern möchten, können Sie list2env verwenden, aber ich bin nicht sicher, dass es der beste Weg, den Sie erreichen wollen wollen. Sie müssen auch Ihre Liste ändern und benannte Liste verwenden, der Name sollte der Name der data.frame sein, die Sie ersetzen müssen.

listDF <- list(df1 = df1, df2 = df2) 

new_col_name <- c("C", "D") 

listDF <- lapply(listDF, function(df) { 
    names(df)[-1] <- new_col_name[-ncol(df)] 
    df 
}) 

list2env(listDF, envir = .GlobalEnv) 
str(df1) 
## 'data.frame': 10 obs. of 2 variables: 
## $ A: int 1 2 3 4 5 6 7 8 9 10 
## $ C: int 11 12 13 14 15 16 17 18 19 20 
+0

Überprüfen Sie den Ausgang gegen den OP-Code. Die Zeile 'colnames (x) [2: length (x)] 'gibt an, dass der Austausch in der zweiten Spalte beginnt. –

+0

@PierreLafortune Danke Pierre du hast recht, ich habe ein paar Anpassungen vorgenommen – dickoa

+0

Sorry dickoa, aber nur die Namen der Spalten * innerhalb * der Liste geändert (also haben df1 und df2 immer noch die ursprünglichen Spaltennamen !!). Ich habe auch versucht, das 'x' von Pierre zu addieren, aber immer noch, das macht den Trick nicht. Ich verwende nur die Liste, um eine lange Liste von DFs zu halten, nicht, dass ich Änderungen in der Liste selbst möchte. Irgendwelche Ideen? danke – user3310782

1

versuchen Sie dies:

lapply (listDF, function(x) { 
    names(x)[-1] <- todos[-length(x)] 
    x 
}) 

Sie eine neue Liste mit geänderten Datenrahmen erhalten. Wenn Sie die listDF direkt zu manipulieren:

for (i in 1:length(listDF)) names(listDF[[i]])[-1] <- todos[-length(listDF[[i]])] 
+0

Danke jogo, aber warum ändert es nicht die Spaltennamen der Datenrahmen? Es ändert nur die Spaltennamen innerhalb der Liste, nicht im unabhängigen DF. – user3310782

+0

aber Sie können tun 'listDF <- lapply (...)' – jogo

+0

Sicher, aber wenn Sie die DF-Spaltennamen ändern möchten, ist dann lapply NICHT der Weg zu gehen? – user3310782