2012-02-14 20 views
29

Desidero rinominare alcune colonne casuali di una cornice dati grande e desidero utilizzare i nomi delle colonne correnti, non gli indici. Gli indici delle colonne potrebbero cambiare se aggiungo o rimuova colonne nei dati, quindi immagino che l'utilizzo dei nomi di colonna esistenti sia una soluzione più stabile. Questo è quello che ho adesso:Rinominare le colonne denominate

mydf = merge(df.1, df.2) 
colnames(mydf)[which(colnames(mydf) == "MyName.1")] = "MyNewName" 

Posso semplificare questo codice, sia il merge() chiamata originale o solo la seconda linea? "MyName.1" è in realtà il risultato di una xts merge di due diversi oggetti xts.

+0

può fornire un piccolo dati riproducibili impostati con l'output desiderato? – Dason

+0

Non è necessario il 'which' there! R accetta booleano nell'operatore []. 'colnames (mydf) [colnames (mydf) ==" MyName.1 "] =" MyNewName "' dovrebbe funzionare! –

+1

'names (mydf) [names (mydf) ==" MyName.1 "] =" MyNewName "' ... circa 13 caratteri in meno. Sebbene, potresti voler sostituire un vettore in quel caso, usa% in% invece di ==. –

risposta

21
names(mydf)[names(mydf) == "MyName.1"] = "MyNewName" # 13 characters shorter. 

Anche se, si potrebbe desiderare di sostituire un vettore alla fine. In tal caso, utilizzare %in% invece di == e impostare MyName.1 come un vettore di lunghezza uguale a MyNewName

4
names(mydf) <- sub("MyName\\.1", "MyNewName", names(mydf)) 

Ciò generalizzare meglio una strategia multipla cambio di nome se si mette un gambo come un modello per essere sostituito utilizzando gsub anziché sub.

+0

Grazie, questo mi ha messo sulla strada giusta. Ora sto facendo: nomi (df) [grep (". 1", names (df))] = c ("AName.Col1", "AName.Col2", "AName.Col3") –

115

Il problema con la modifica dei nomi delle colonne di un data.frame è che, quasi incredibilmente, l'intero data.frame viene copiato. Anche quando è in .GlobalEnv e non ci sono altri punti variabili.

Il data.table package ha una funzione setnames() che modifica i nomi delle colonne per riferimento senza copiare l'intero set di dati. data.table è diverso in quanto non copia-su-scrittura, che può essere molto importante per i set di dati di grandi dimensioni. (Hai detto il tuo set di dati era grande.)

require(data.table) 
setnames(DT,"MyName.1","MyNewName") 
?setnames 
+4

Heh. Questo è un problema nel fare quasi tutto con un 'data.frame'. Penseresti che anche cambiare i livelli dei fattori sarebbe rapido, ma non lo è. (Sono sicuro che tu lo sappia tutti.) –

+0

@DWin. Ciao. Penso che 'setattrib()' in 'data.table' possa cambiare i livelli di una colonna per riferimento (anche in' data.frame'). Ovviamente deve essere fatto con cura. Potrebbe esserci una nuova funzione 'setlevels()' che cambierebbe uno o più livelli (con la stessa interfaccia di 'setnames()')? Btw, ': =' aggiunge già nuovi livelli di fattore per riferimento, che è complicato in base. C'è un bel po 'di codice C dietro questo. –

23

plyr ha una funzione di ridenominazione proprio per questo scopo:

library(plyr) 
mydf <- rename(mydf, c("MyName.1" = "MyNewName")) 
+3

Questa funzione è ora inclusa anche nel pacchetto 'dplyr'. –

Problemi correlati