2015-06-11 7 views
5

Non riesco a capire come utilizzare la funzione dplyr di SE con nomi di variabili non validi, ad esempio selezionando una variabile con uno spazio al suo interno.Come usare dplyr SE con nomi "non validi" (cioè contenenti spazi)?

Esempio:

df <- dplyr::data_frame(`a b` = 1) 
myvar <- "a b" 

Se voglio selezionare a b variabile, posso farlo con dplyr::select(df, `a b`), ma come faccio a farlo con select_?

suppongo ho solo bisogno di trovare una funzione che "avvolge" una stringa in backticks, in modo che io possa chiamare dplyr::select_(df, backtick(myvar))

+0

Il mio primo suggerimento sarebbe non usare nomi non validi! Perché dovresti farlo? – MrFlick

+0

sviluppo di un'app che consente all'utente di cambiare il nome di una variabile, e per i biologi molte volte preferirebbero avere spazi in un nome, sarebbe difficile mettere una nota "non usare spazi o caratteri speciali", Sembrerò strano per loro. –

+0

@divide_by_zero sì Posso farlo se conosco il nome della variabile, ma se non lo faccio, ho bisogno che qualcuno "avvolga" la variabile nei backtick. Come posso ottenere ciò che hai fatto usando 'myvar' invece di hardcoding' a b'? –

risposta

7

Come MyFlick detto nei commenti, questo comportamento deve essere generalmente evitato, ma se si vuole per farlo funzionare è possibile rendere il proprio apice inverso involucro

backtick <- function(x) paste0("`", x, "`") 
dplyr::select_(df, backtick(myvar)) 

EDIT: Hadley ha risposto ai miei tweets su questo e mi ha mostrato che semplicemente utilizzando as.name lavorerà per questo, invece di utilizzare backticks:

df <- dplyr::data_frame(`a b` = 1) 
myvar <- "a b" 
dplyr::select_(df, as.name(myvar)) 
2

La mia soluzione era sfruttare la capacità di select di utilizzare la colonna posizioni. La soluzione as.name non sembra funzionare per alcune delle mie colonne.

select(df, which(names(df) %in% myvar)) 

o anche più succintamente se già in un tubo:

df %>% 
select(which(names(.) %in% myvar)) 

Anche se questo utilizza select, a mio avviso, non si basa su NSE.

Si noti che se non ci sono corrispondenze, tutte le colonne verranno eliminate senza errori o avvisi.

Problemi correlati