2016-10-11 2 views
6

umkehren kann Ich habe endlos gesucht und irgendwie hat nichts einfaches Problem gelöst.Wie man die Reihenfolge eines Datenrahmens in R

Ich habe einen Datenrahmen namens Preise, in denen es 4 Spalten gibt, von denen eine eine Liste von historischen Daten ist - die anderen 3 sind Listen der Preise für Produkte.

1 10/10/2016 53.14 50.366 51.87 
2 07/10/2016 51.93 49.207 50.38 
3 06/10/2016 52.51 49.655 50.98 
4 05/10/2016 51.86 49.076 50.38 
5 04/10/2016 50.87 48.186 49.3 
6 03/10/2016 50.89 48.075 49.4 
7 30/09/2016 50.19 47.384 48.82 
8 29/09/2016 49.81 46.924 48.4 
9 28/09/2016 49.24 46.062 47.65 
10 27/09/2016 46.52 43.599 45.24 

Die Liste ist 252 Preise lang. Wie kann ich meine Ausgabe mit dem letzten Datum am Ende der Liste und den entsprechenden Preisen mit den neuesten Preisen am Ende der Liste speichern lassen?

+5

Wenn 'df' Ihr' data.frame' ist, die Datumsspalte 'date' heißt und Sie Ihren Datensatz nach Datum sortieren möchten, versuchen Sie einfach' df [order (df $ date),] '. – nicola

+0

Stellen Sie auch sicher, dass Ihre 'date'-Spalte auf' asDate' gesetzt ist. – Sotos

+2

Das OP-Datum ist kein 'Date'-Objekt, leider @Sotos. Es wäre ein ISO-Format-String, wenn es wäre. Ich bin aber sehr neugierig, warum die Reihenfolge der Darstellung wichtig ist (da wir vielleicht in der Lage sind, bei jeder gewünschten Verarbeitung zu helfen, die auf der Reihenfolge beruht). Aber da das OP es anscheinend schon in umgekehrter Reihenfolge hat und die Anzahl der Zeilen 'df [252: 1,]' auch funktionieren würde. – hrbrmstr

Antwort

7

Wenn Sie nur die Reihenfolge der Zeilen in einem Datenrahmen rückgängig machen möchten, können Sie folgendes tun:

df<- df[seq(dim(df)[1],1),] 
+0

Schöne Lösung. Aber Sie brauchen 'seq' hier nicht. Es wird nur Ihren Code verlangsamen. – 5th

4

Nur der Vollständigkeit halber willen. Es ist eigentlich nicht nötig, hier seq anzurufen. Sie können nur die : -R-Logik verwenden:

### Create some sample data 
n=252 
sampledata<-data.frame(a=sample(letters,n,replace=TRUE),b=rnorm(n,1,0.7), 
         c=rnorm(n,1,0.6),d=runif(n)) 

### Compare some different ways to reorder the dataframe 
myfun1<-function(df=sampledata){df<-df[seq(nrow(df),1),]} 
myfun2<-function(df=sampledata){df<-df[seq(dim(df)[1],1),]} 
myfun3<-function(df=sampledata){df<-df[dim(df)[1]:1,]} 
myfun4<-function(df=sampledata){df<-df[nrow(df):1,]} 

### Microbenchmark the functions 


microbenchmark::microbenchmark(myfun1(),myfun2(),myfun3(),myfun4(),times=1000L) 
    Unit: microseconds 
     expr min  lq  mean median  uq  max neval 
    myfun1() 63.994 67.686 117.61797 71.3780 87.3765 5818.494 1000 
    myfun2() 63.173 67.686 99.29120 70.9680 87.7865 2299.258 1000 
    myfun3() 56.610 60.302 92.18913 62.7635 76.9155 3241.522 1000 
    myfun4() 56.610 60.302 99.52666 63.1740 77.5310 4440.582 1000 

Der schnellste Weg in meinem Prozeß hier waren df<-df[dim(df)[1]:1,] zu verwenden. Die Verwendung von nrow anstelle von dim ist jedoch nur geringfügig langsamer. Dies ist eine Frage der persönlichen Präferenz.

Mit seq hier verlangsamt definitiv den Prozess.

Verwandte Themen