2012-10-09 8 views
8

ho un seguenti frame di datiCome ordinare il mio dataframe lexicographicaly

a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3)) 
> a 
    a b c 
1 1 1 1 
2 2 2 2 
3 3 3 10 
4 4 10 11 
5 5 12 X 
6 6 21 Y 
7 7 4 3 

voglio ordinare tutto il frame di dati al fine lessicografico, in modo che l'uscita (per esempio, la colonna "c") dovrebbe essere come

> a[,"c"] 
[1] 1 2 3 10 11 X Y 

ho cercato e sto geting risposta diversa

indata <- a[do.call(order,a[,c("c","a","b")]),] 
> indata[,"c"] 
[1] 1 10 11 2 3 X Y 
Levels: 1 10 11 2 3 X Y 

ho provato gtools, Mixedorder pacchetto di un ND ha funzionato bene su una colonna:

> a[mixedorder(a$c),] 
    a b c 
1 1 1 1 
2 2 2 2 
3 3 3 10 
4 4 10 11 
5 5 12 X 
6 6 21 Y 
7 7 4 3 

ma non funziona se includo più colonne:

> a[with(a,order(mixedorder(c),mixedorder(b),mixedorder(a))),] 
    a b c 
1 1 1 1 
2 2 2 2 
4 4 10 11 
5 5 12 X 
6 6 21 Y 
7 7 4 3 
3 3 3 10 

anche se mi aspetto:

a b c 
1 1 1 1 
2 2 2 2 
4 7 4 3 
5 3 3 10 
6 4 10 11 
7 5 12 X 
3 6 21 Y 
+0

Dovrai essere più chiaro. Vuoi ordinare solo la colonna 'c', o l'intero frame dei dati rispetto alle colonne' c'? – joran

+0

Voglio ordinare l'intero frame di dati rispetto a c. Ho dato un [, "c"] per una facile comprensione – user1631306

risposta

7

Una possibilità è quella di utilizzare mixedorder() dal pacchetto gtools.

library(gtools) 
a[mixedorder(a$c),] 
# a b c 
# 1 1 1 1 
# 2 2 2 2 
# 7 7 4 3 
# 3 3 3 10 
# 4 4 10 11 
# 5 5 12 X 
# 6 6 21 Y 
+1

Come utilizzerei più colonne per l'ordinamento (prima c, poi b e poi a)? – user1631306

+1

@ user1631306 Provare a 'organizzare' nel pacchetto ** plyr **. – joran

+2

@ user1631306 - In tal caso, puoi fare ciò: 'a [con (a, ordine (mixedorder (c), b, a)),]'. –

4

Attaccando della base si potrebbe fare una funzione da soli:

a = data.frame(a=c(1,2,3,4,5,6,7),b=c(1,2,3,10,12,21,4),c=c(1,2,10,11,"X","Y",3)) 

SORTER_DEVICE <- function(x) { 
    c(sort(as.numeric(na.omit(gsub("[a-zA-Z]", NA, x)))), 
     sort(na.omit(gsub("[0-9]", NA, x)))) 
} 
data.frame(apply(a, 2, SORTER_DEVICE)) 
1

Purtroppo mixedsort non (ancora) il supporto per più di ordinamento della colonna. Quindi, è necessario implementare da soli, per esempio come questo:

a[order(sub("[0-9]+", "", a$c), 
     as.numeric(sub("[[:alpha:]]*([[:digit:]]*)", '\\1', a$c)), 
     as.numeric(a$b), 
     as.numeric(a$a)), ] 

Questo primo, ordinamenti alfanumerico data.frame utilizzando un $ c, e per le situazioni cravatta (che in realtà non esiste nella tua data.frame ' a '), usa $ b e $ a.

uscita è:

a b c 
1 1 1 1 
2 2 2 2 
7 7 4 3 
3 3 3 10 
4 4 10 11 
5 5 12 X 
6 6 21 Y 

PS: Questo è stato scritto da David Winsemius in this post come risposta a una domanda simile.

Problemi correlati