order()
関数がどのように機能するかを理解しようとしています。インデックスの順列が返され、並べ替えると元のベクトルが並べ替えられるという印象を受けました。
例えば、
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
c(2, 3, 1, 4)
ソートされたリストは1045 50 96になるので、これが返されることを期待していました。
誰かがこの関数の戻り値を理解するのを手伝ってもらえますか?
回答:
これはそれを説明しているようです。
定義
order
ISa[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
のでrank
、番号がどのような順序である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の折れ線グラフを取得した場合。
私はあなたがランクを考えているに違いない。
order(a, decreasing = T)
そして、rank(a)
同等の答えを返します。
a<-c(4,2,1,80,13)
それならそうあるorder(a)
べきですが3 4 5 1 2
、奇妙なことに私は得ています3 2 1 5 4
rank
とorder
同じ?
order(order(a))
と同じように返されます。ある場合は、と同じように返されます。rank(a)
rank(a, ties.method="first")
1Dベクトルまたはデータの単一列を並べ替えるには、並べ替え関数を呼び出してシーケンスを渡します。
一方、順序関数は、データを2次元データ、つまり、行列またはデータフレームに収集されたデータの複数の列でソートするために必要です。
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
これは注文が行うことです。2次元データの「ソート」です。言い換えると、行番号で構成される1D整数インデックスを返し、そのベクトルに従って行を並べ替えると、列に対して正しい行指向の並べ替えが行われます。ディストを
仕組みは次のとおりです。上記では、sortを使用してDist列をソートしました。Dist列でデータフレーム全体を並べ替えるには、上記で使用した「sort」とまったく同じ方法で「order」を使用します。
ndx = order(fg$Dist, decreasing=T)
(私は通常、「order」から返された配列を「index」を表す変数「ndx」にバインドします。これは、ソートするためのインデックス配列として使用するためです。)
それがステップ1でした。これがステップ2です。
'ndx'、 'sort'によって返されるものは、データフレーム 'fg'を並べ替えるためのインデックス配列として使用されます。
fg_sorted = fg[ndx,]
fg_sortedは、すぐ上の並べ替えられたデータフレームです。
つまり、「sort」はインデックス配列(並べ替える列の並べ替え順序を指定)を作成するために使用され、データフレーム(または行列)を並べ替えるためのインデックス配列として使用されます。
(@dougによって投稿され、@ duffymoによってリンクされた優れた資料を要約するために、ここでアイデアを非常に簡単にレイアウトすると役立つと思いました。それぞれに+1です。)
?orderは、元のベクトルを並べ替えるために、元のベクトルのどの要素を1番目、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
order
とrank
は実際には互いに逆です(少なくともの値a
が一意である限り)。それぞれの値に名前(/ labels)( '1'、 '2'、 '3'、 '4')があると想像すると、の値はorder(a)
、rank(a)
各ラベルのどの位置にあるかを示します(たとえば、の最初の値order(a)
(3)は、「1」がの3番目の位置で発生することを示しrank(a)
、その逆も同様です(たとえば、rank(a)
(3)の2番目の値は、「2」がの3番目の位置で発生することを示しますorder(a)
)。これらは逆順列です:rank(order(a))
= order(rank(a))
=1 2 3 4
この小さなコードを実行することで、注文機能を理解することができました
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
x
でしcbind()
。
それらは似ていますが同じではありません
set.seed(0)
x<-matrix(rnorm(10),1)
# one can compute from the other
rank(x) == col(x)%*%diag(length(x))[order(x),]
order(x) == col(x)%*%diag(length(x))[rank(x),]
# rank can be used to sort
sort(x) == x%*%diag(length(x))[rank(x),]
all(x==x[order(x)][rank(x)])
常に真です。一部の順列はそれ自体が逆ですが、ほとんどはそうではありません。order()から出てくるソート順列の逆はrank()です。これは、それらが同じである場合とそうでない場合がある理由を説明しています。