2016-10-11 108 views
6

我已經無止境地尋找這個,並且莫名其妙地沒有解決這個簡單的問題。如何在R中反轉數據幀的順序

我有一個名爲價格的數據框,其中有4列,其中一列是歷史日期列表 - 其他3列是產品價格列表。

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 

該列表是價格長252。我怎樣才能讓我的輸出保存在列表底部的最新日期以及列表底部的最新價格中列出的相應價格?

+5

如果'df'是你的'data.frame',日期列被稱爲'date',並且你想按日期對數據集進行排序,只需嘗試'df [order(df $ date),]'。 – nicola

+0

還要確保你的'日期'列設置'as.Date' – Sotos

+2

OP的日期不是'Date'對象,不幸的是@Sotos。如果是ISO格式的話,它會是。儘管我非常好奇爲什麼顯示順序很重要(因爲我們可能能夠幫助他們進行任何依賴於順序的處理)。但是,由於OP似乎已經以相反的順序使用了它,並且知道'df [252:1,]行的行號也可以工作。 – hrbrmstr

回答

7

如果你只是想扭轉行的順序在一個數據幀,可以做到以下幾點:

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

不錯的解決方案。但是這裏不需要'seq'。它只會減慢你的代碼。 – 5th

4

只是爲了完整性的緣故。實際上這裏不需要撥打seq。你可以只使用: -R邏輯:

### 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 

最快的方式在我這裏試驗是使用df<-df[dim(df)[1]:1,]。但是,使用nrow而不是dim僅稍微慢一些。這是個人喜好的問題。

使用seq這裏肯定會減慢過程。