2014-10-20 2 views
23

Le funzioni di ridenominazione di dplyr richiedono che il nuovo nome di colonna venga passato come nomi di variabili non quotate. Tuttavia ho una funzione in cui il nome della colonna è costruito incollando una stringa su un argomento passato e così è una stringa di caratteri.Immettere i nomi di nuove colonne come stringa nella funzione di ridenominazione di dplyr

Per esempio dire che ho avuto questa funzione

myFunc <- function(df, col){ 
    new <- paste0(col, '_1') 
    out <- dplyr::rename(df, new = old) 
    return(out) 
} 

Se corro questo

df <- data.frame(a = 1:3, old = 4:6) 
myFunc(df, 'x') 

ottengo

a new 
1 1 4 
2 2 5 
3 3 6 

Mentre io voglio la colonna 'nuovo' per essere il nome della stringa che ho costruito ('x_1'), ovvero

a x_1 
1 1 4 
2 2 5 
3 3 6 

Esiste comunque?

+3

Dalla [annuncio di 'dplyr 0.3'] (http://blog.rstudio.org/2014/10/13/dplyr-0-3-2/):" Ora puoi programmare con 'dplyr' - ogni funzione che utilizza la valutazione non standard (NSE) ha anche un gemello di valutazione standard (SE) che termina con '_' [...] La versione SE di ogni funzione ha argomenti simili, ma devono essere esplicitamente" quotati ". " Quindi, controlla se 'rename_' potrebbe essere utile qui. – Henrik

+0

Grazie, è utile sapere ma in questo caso non cambia nulla. Funzionerebbe se la colonna che stavo passando fosse il vecchio nome della colonna, ma cambiando la funzione sopra per usare rename_ (e mettendo il vecchio tra virgolette) restituisce sempre lo stesso – user1165199

+2

@ user1165199 Farei 'colnames (df) [colnames (df)% in% "old"] <- paste0 ("x", "_") '(in una funzione se necessario) in quanto è in grado di sostituire facilmente un vettore di nomi. – akrun

risposta

21

Penso che questo sia quello che stavi cercando. E 'l'uso di rename_ come @Henrik suggerito, ma l'argomento ha un, diciamo, interessante, nome:

> myFunc <- function(df, col){ 
+ new <- paste0(col, '_1') 
+ out <- dplyr::rename_(df, .dots=setNames(list(col), new)) 
+ return(out) 
+ } 
> myFunc(data.frame(x=c(1,2,3)), "x") 
    x_1 
1 1 
2 2 
3 3 
> 

Nota l'uso di setNames per utilizzare il valore della nuova come nome nella lista.

+4

io non sono sicuro di quello che la 'lista (col)' sta cercando di fare. Se fai semplicemente '.dots = setNames (col, new)', il tuo esempio funziona ancora. E se hai più colonne che stai rinominando, 'list()' causerà problemi perché 'length (list (col))! = Length (new)' – gregmacfarlane