web-dev-qa-db-ja.com

Rのデータフレームの順序を逆にする方法

私はこれを際限なく探しましたが、何とかしてこれを解決したものはありませんsimple問題。

私は4つの列がある価格と呼ばれるデータフレームを持っています。その1つは履歴日付のリストです-他の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価格です。リストの一番下に最新の日付を表示し、リストの一番下に最新の価格で対応する価格を表示して出力を保存するにはどうすればよいですか?

22
jmn8

データフレーム内の行の順序を逆にするだけの場合は、次のことができます。

df<- df[seq(dim(df)[1],1),]
12
user7559006

完全を期すためだけに。実際には、ここでseqを呼び出す必要はありません。 _:_- R-logicを使用するだけです:

_### 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を使用すると、間違いなくプロセスが遅くなります。

2018年9月更新:

速度の観点から、ここでdplyrを使用する理由はほとんどありません。おそらく90%のユーザーにとって、基本的なR機能で十分です。他の10%は、データベースのクエリにdplyrを使用するか、別の言語へのコード翻訳が必要です。

_## hmhensen's function
dplyr_fun<-function(df=sampledata){df %>% arrange(rev(rownames(.)))}

microbenchmark::microbenchmark(myfun3(),myfun4(),dplyr_fun(),times=1000L)
Unit: microseconds
        expr    min      lq      mean  median      uq    max neval
    myfun3()   55.8   69.75  132.8178  103.85  139.95 8949.3  1000
    myfun4()   55.9   68.40  115.6418  100.05  135.00 2409.1  1000
 dplyr_fun() 1364.8 1541.15 2173.0717 1786.10 2757.80 8434.8  1000
_
10
5th

別のtidyverseソリューションと私は最も簡単なものだと思う:

df %>% map_df(rev)

または_purrr::map_df_のみを使用して、map_df(df, rev)を実行できます。

6
pasipasi

行の順序を逆にする方法に関するOPの質問に対するdplyrtidyverse)ソリューションがあります。

データフレームがdfと呼ばれると仮定すると、次のことができます。

_df %>% arrange(rev(rownames(.)))
_

説明: "。"プレースホルダーは、パイプデータフレームを入力として受け取ります。その後、rownames(df)はインデックスのベクトルになり、1:nrow(df)revは順序とarrangeはそれに応じてdfを並べ替えます。

パイプを使用しない場合、以下は同じことを行います。

_arrange(df, rev(rownames(df)))
_

OPが最初にコメントで説明されているように日付をDateまたはPOSIX形式に変換した場合、もちろんdf %>% arrange(Date)を使用できます。

しかし、最初の方法はOPの質問に答えるものです。

3
hmhensen

ベースRに固執したい場合は、lapply()も使用できます。

do.call(cbind, lapply(df, rev))
0
Joe