2013-07-25 8 views
8

Ho alcuni dati che devono essere formattati come (% d /% m /% Y). I dati sono fuori ordine cronologico perché sono ordinati per il primo numero che è il giorno, non il mese.Ordine dataframe basato cronologicamente sulle date che sono formattate% d /% m /% Y

Spero di poter specificare su order o reorder che desidero che l'ordinamento avvenga diversamente. Non sono sicuro di come farlo.

Ecco alcuni dati relativi alle date da ordinare:

date 
1/1/2009 
1/1/2010 
1/1/2011 
5/4/2009 
5/4/2011 
10/2/2009 
10/3/2011 
15/9/2010 
15/3/2009 
31/12/2011 
31/7/2009 

Grazie per eventuali suggerimenti.

+0

Vuoi anche per preservare tale data stringa nella sua formato nativo per es per etichettare le zecche sulle trame? conservare come colonna separata – smci

risposta

10

In caso di ordine con colonna date convertirlo Formato data.

df[order(as.Date(df$date,format="%d/%m/%Y")),,drop=FALSE] 
     date 
1 1/1/2009 
6 10/2/2009 
9 15/3/2009 
4 5/4/2009 
11 31/7/2009 
2 1/1/2010 
8 15/9/2010 
3 1/1/2011 
7 10/3/2011 
5 5/4/2011 
10 31/12/2011 
+0

Grazie! Mi chiedo quante volte devo dire a R qualcosa è un appuntamento, ma credo che la risposta sia "ogni volta". – Nazer

0

Brutto ma sembra funzionare:

date[order(sapply(strsplit(date, "/"), 
        function(x) { paste(x[3], sprintf("%02d", as.integer(x[1])), 
              sprintf("%02d", as.integer(x[2])), 
              sep="") 
           } 
       ) 
     ) 
    ] 
+0

Ti dispiacerebbe aggiungere commenti e rientri al tuo codice in modo che possiamo leggerlo meglio (ed evitare lo scorrimento orizzontale)? –

8

Questo è più facile con un piccolo aiuto da plyr e lubridate:

library(lubridate) 
library(plyr) 

df <- read.csv(text = "date 
1/1/2009 
1/1/2010 
1/1/2011 
5/4/2009 
5/4/2011 
10/2/2009 
10/3/2011 
15/9/2010 
15/3/2009 
31/12/2011 
31/7/2009", stringsAsFactors = FALSE) 

# Convert variable to date  
df$date <- dmy(df$date) 
arrange(df, date) 
# Or for descending order 
arrange(df, desc(date)) 
+1

Mi permetto di dissentire sul * più facile * che rivendichi qui in quanto le soluzioni accettate vincono non richiedendo pacchetti aggiuntivi e risolvono il problema in una singola istruzione. –

+3

Se vuoi, puoi giocare a golf con codice. Penso che la mia soluzione sia una buona alternativa perché non hai bisogno di sapere come funzionano le stringhe del formato data, o perché hai bisogno di 'drop = FALSE' – hadley

+1

Puoi reinventare R in 'H' sostituendo/ridefinendo ogni singolo aspetto a ciò che fa R. Un sacco di mulini a vento lasciato in Spagna per voi a gridare, Don Chisciotte :) –