2014-11-20 15 views
5

Come posso utilizzare dplyr::arrange(dplyr::desc()) e passare una stringa come nome della colonna?Come usare dplyr :: arrange (desc()) quando si usa una stringa come nome di colonna?

Ecco un set di dati campione:

df <- data.frame(a = 1:3, b = 3:1) 

Esempi che funzionano:

df %>% dplyr::arrange(b) 
df %>% dplyr::arrange_("b") 
df %>% dplyr::arrange(dplyr::desc(b)) 

Ma io non riesco a utilizzare una stringa sia con arrange e desc, queste sono le due versione che ho provato che non funziona:

df %>% dplyr::arrange(dplyr::desc("b")) 
df %>% dplyr::arrange_(dplyr::desc("b")) 

Grazie!

+1

Potrebbe essere come questo 'df%>% dplyr :: organizzare (dplyr :: disc (df [ "b"])) '? Francamente, non sono sicuro ... – KFB

+0

Avrai bisogno di usare interp – hadley

+0

Grazie per i suggerimenti e le conclusioni dupe, ma non riesco ancora a capire come usare interp (dal pacchetto lazyeval?) Per far funzionare questo semplice esempio. Continuerò a cercare di capire NSE, ma sarebbe fantastico se potessi anche pubblicare la soluzione se non ti ci vuole troppo tempo. Grazie mille comunque –

risposta

1

tl; dr:df %>% arrange(desc(!!sym("b")))

Innanzitutto le valutazioni standard dplyr verbi sono obsoleti, così invece di:

library(dplyr) 
x <- "b" 
df %>% arrange_(x) 

è ora raccomandato digitare:

library(dplyr) 
library(rlang) 
df %>% arrange(!!sym(x)) 

o:

df %>% arrange(UQ(sym(x))) 

dove sym, !!, e UQ provengono da rlang pacchetto.

Vedere ?arrange_, collega a un argomento della guida denominato Deprecated SE versions of main verbs. e offre alcuni dettagli.

Da lì a ordine decrescente è semplice per adattare la nuova formulazione:

df %>% arrange(desc(!!sym(x))) 

Ma questo funziona bene così:

df %>% arrange(desc(.[[x]])) 

Cordiali saluti, per farlo funzionare con arrange_ avremmo potuto fare quanto segue Questi non sono l'approccio raccomandato ma per il processo di pensiero è interessante.

df %>% arrange_(paste0("desc(",x,")")) 

Quale può essere semplificata se abbiamo variabili numeriche, come nell'esempio di OP:

df %>% arrange_(paste0("-",x)) 

o utilizzando lazyeval::interp

df %>% arrange_(interp(~desc(y),y=as.name(x))) 

O come @ Shyam-Saladi propone:

desc_ <- function(x) lazyeval::interp(~desc(var), var = as.name(x)) 
# or just 
# desc_ <- function(x) paste0("desc(",x,")") 
df %>% arrange_(desc_(x)) 
Problemi correlati