私はこれを際限なく探しましたが、何とかしてこれを解決したものはありません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価格です。リストの一番下に最新の日付を表示し、リストの一番下に最新の価格で対応する価格を表示して出力を保存するにはどうすればよいですか?
データフレーム内の行の順序を逆にするだけの場合は、次のことができます。
df<- df[seq(dim(df)[1],1),]
完全を期すためだけに。実際には、ここで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
_
別のtidyverse
ソリューションと私は最も簡単なものだと思う:
df %>% map_df(rev)
または_purrr::map_df
_のみを使用して、map_df(df, rev)
を実行できます。
行の順序を逆にする方法に関するOPの質問に対するdplyr
(tidyverse
)ソリューションがあります。
データフレームが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の質問に答えるものです。
ベースRに固執したい場合は、lapply()
も使用できます。
do.call(cbind, lapply(df, rev))