2016-10-11 112 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这里肯定会减慢过程。