order()
関数の動作を理解しようとしています。私は、並べ替えると元のベクトルを並べ替えるインデックスの並べ替えを返したという印象を受けました。
例えば、
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
ソートされたリストは10 45 50 96になるので、これはc(2, 3, 1, 4)
を返すと予想していました。
誰かがこの関数の戻り値を理解するのを手伝ってもらえますか?
これ はそれを説明しているようです。
order
の定義は、a[order(a)]
が昇順であるということです。これは、正しい順序が4番目、2番目、1番目、3番目の要素の例で機能します。
rank
を探しているかもしれません。これは要素のランクを返しますR> a <- c(4.1, 3.2, 6.1, 3.1)
R> order(a)
[1] 4 2 1 3
R> rank(a)
[1] 3 2 4 1
sorank
は番号の順序を示し、order
は番号を昇順で取得する方法を示します。
plot(a, rank(a)/length(a))
は、CDFのグラフを提供します。ただし、order
が役立つ理由を確認するには、データが昇順ではないため、混乱を招くplot(a, rank(a)/length(a),type="S")
を試してください。もしそうなら
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
または単にoo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
CDFの折れ線グラフを取得します。
ランクを考えているに違いない。
1Dベクトルまたはデータの単一列をソートするには、sort関数を呼び出してシーケンスを渡します。
一方、データを並べ替えるには、order関数が必要ですtwo-次元データ-つまり、マトリックスまたはデータフレームに収集されたデータの複数の列。
Stadium Home Week Qtr Away Off Def Result Kicker Dist
751 Out PHI 14 4 NYG PHI NYG Good D.Akers 50
491 Out KC 9 1 Oak OAK KC Good S.Janikowski 32
702 Out Oak 15 4 CLE CLE Oak Good P.Dawson 37
571 Out NE 1 2 Oak OAK NE Missed S.Janikowski 43
654 Out NYG 11 2 PHI NYG PHI Good J.Feely 26
307 Out DEN 14 2 BAL DEN BAL Good J.Elam 48
492 Out KC 13 3 DEN KC DEN Good L.Tynes 34
691 Out NYJ 17 3 BUF NYJ BUF Good M.Nugent 25
164 Out CHI 13 2 GB CHI GB Good R.Gould 25
80 Out BAL 1 2 IND IND BAL Good M.Vanderjagt 20
これは、2008年のNFLシーズンにおけるフィールドゴールの試みのデータの抜粋です。これは、「fg」と呼ばれるデータフレームです。これらの10個のデータポイントが、2008年に試みられたすべてのフィールドゴールを表していると仮定します。さらに、その年に試みた最長フィールドゴールの距離、キックした人、およびそれが良いかどうかを知りたいとします。また、2番目に長いもの、3番目に長いものなども知りたい。そして最後に、最短フィールドゴールの試みが必要です。
さて、あなたはこれを行うことができます:
sort(fg$Dist, decreasing=T)
返される値:50 48 43 37 34 32 26 25 25 20
これは正しいですが、あまり有用ではありません。フィールドゴール試行の最長距離、2番目に長い距離、そして最短距離を教えてくれます。ただし、それだけがわかっています。たとえば、キッカーが誰であったか、試みが成功したかどうかなどはわかりません。もちろん、「Dist」列でソートされたデータフレーム全体が必要です(別の方法で、単一の属性Distですべてのデータ行をソートする場合、次のようになります。
Stadium Home Week Qtr Away Off Def Result Kicker Dist
751 Out PHI 14 4 NYG PHI NYG Good D.Akers 50
307 Out DEN 14 2 BAL DEN BAL Good J.Elam 48
571 Out NE 1 2 Oak OAK NE Missed S.Janikowski 43
702 Out Oak 15 4 CLE CLE Oak Good P.Dawson 37
492 Out KC 13 3 DEN KC DEN Good L.Tynes 34
491 Out KC 9 1 Oak OAK KC Good S.Janikowski 32
654 Out NYG 11 2 PHI NYG PHI Good J.Feely 26
691 Out NYJ 17 3 BUF NYJ BUF Good M.Nugent 25
164 Out CHI 13 2 GB CHI GB Good R.Gould 25
80 Out BAL 1 2 IND IND BAL Good M.Vanderjagt 20
これはorderが行うことです。 2次元データの場合は「ソート」です。別の言い方をすれば、行番号で構成される1D整数インデックスを返します。その結果、そのベクトルに従って行をソートすると、列に対して正しい行指向のソートが得られますDist
仕組みは次のとおりです。上記では、sortがDist列のソートに使用されました。 Dist列のデータフレーム全体を並べ替えるには、「order」を使用します。上で「sort」を使用するのとまったく同じ方法を使用します。
ndx = order(fg$Dist, decreasing=T)
(通常、「order」から返された配列を、「index」を表す変数「ndx」にバインドします。これは、ソートするためのインデックス配列として使用するためです。)
それがステップ1で、ここにステップ2があります。
「ndx」、「sort」によって返されるものは、re-orderデータフレーム「fg」へのインデックス配列として使用されます。
fg_sorted = fg[ndx,]
fg_sortedは、すぐ上に並べ替えられたデータフレームです。
要するに、 'sort'はインデックス配列(ソートする列のソート順を指定する)を作成するために使用され、その後、データフレーム(またはマトリックス)を再配列するためのインデックス配列として使用されます。
(@ dougによって投稿された優れた資料を要約するために、ここにアイデアを非常に簡単にレイアウトすることは役立つと思いました、および@duffymoによってリンクされました; +1にそれぞれ、btw。)
?order は、元のベクターをソートするために、元のベクターのどの要素を最初、2番目などに配置する必要があるかを示しますが、 ?rank はどの要素を示します最低値、2番目に低い値などがあります。例えば:
> a <- c(45, 50, 10, 96)
> order(a)
[1] 3 1 2 4
> rank(a)
[1] 2 3 1 4
order(a)
は、「並べ替えるときに最初に3番目の要素を置く...」と言っていますが、rank(a)
は、「最初の要素が2番目に小さい...」と言っています。 (どちらの要素が最も低いかなど、両者は一致していることに注意してください。情報の表示方法が異なるだけです。)したがって、order()
を使用してソートできますが、rank()
仕方:
> a[order(a)]
[1] 10 45 50 96
> sort(a)
[1] 10 45 50 96
> a[rank(a)]
[1] 50 10 45 96
一般に、ベクトルが既にソートされていない限り、order()
はrank()
と等しくなりません。
> b <- sort(a)
> order(b)==rank(b)
[1] TRUE TRUE TRUE TRUE
また、order()
は(本質的に)データのランクで動作しているため、情報に影響を与えずにデータを構成できますが、逆の方法では意味がわからなくなります。
> order(rank(a))==order(a)
[1] TRUE TRUE TRUE TRUE
> rank(order(a))==rank(a)
[1] FALSE FALSE FALSE TRUE
この小さなコードを実行すると、順序関数を理解できました
x <- c(3, 22, 5, 1, 77)
cbind(
index=1:length(x),
rank=rank(x),
x,
order=order(x),
sort=sort(x)
)
index rank x order sort
[1,] 1 2 3 4 1
[2,] 2 4 22 1 3
[3,] 3 3 5 3 5
[4,] 4 1 1 2 22
[5,] 5 5 77 5 77
参照: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html
これはある時点で役立ちます。
a <- c(45,50,10,96)
a[order(a)]
あなたが得るものは
[1] 10 45 50 96
私が書いたコードは、 "a"のサブセット全体として "a"が必要であり、最低値から最高値の順に並べたいことを示しています。
簡単に言えば、order()
は、大きさが増加する要素の位置を示します。
たとえば、order(c(10,20,30))
は1,2,を、order(c(30,20,10))
は,2,1を返します。