2014-10-24 15 views
28

dati forniti:Riordinare le righe con ordine personalizzato

library(data.table) 
DT = data.table(category=LETTERS[1:3], b=1:3) 
DT 
# category b 
# 1:  A 1 
# 2:  B 2 
# 3:  C 3 

Uso dplyr, come riorganizzare le righe per ottenere ordine specifico c("C", "A", "B") in category?

# category b 
# 1:  C 3 
# 2:  A 1 
# 3:  B 2 

risposta

50

Innanzitutto, creare un vettore con le lettere nell'ordine desiderato. Quindi match * il vettore con la variabile da ordinare. match restituisce indici della (prima) partite, che possono essere collegati in slice:

library(dplyr) 

# create a vector with letters in the desired order 
x <- c("C", "A", "B") 

DT %>% 
    slice(match(x, category)) 
# category b 
# 1  C 3 
# 2  A 1 
# 3  B 2 

Un altro modo sarebbe quello di convertire "categoria" ad un factor, impostare levels per l'ordine desiderato, e utilizzare arrange:

DT %>% 
    mutate(category = factor(category, levels = x)) %>% 
    arrange(category)  
# category b 
# 1  C 3 
# 2  A 1 
# 3  B 2 

* Il metodo match è ispirato a this answer.

+3

Come menzionato nella risposta di ispirazione, fai attenzione all'effetto dei duplicati quando usi 'match()'. – farnsy

Problemi correlati