Memahami fungsi order ()

89

Saya mencoba memahami cara kerja order()fungsi. Saya mendapat kesan bahwa itu mengembalikan permutasi indeks, yang ketika diurutkan, akan mengurutkan vektor asli.

Misalnya,

> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4

Saya berharap ini kembali c(2, 3, 1, 4), karena daftar yang diurutkan adalah 10 45 50 96.

Dapatkah seseorang membantu saya memahami nilai kembalian dari fungsi ini?

jeffshantz.dll
sumber

Jawaban:

101

Ini sepertinya menjelaskannya.

Definisi dari orderis yaitu a[order(a)]dalam urutan meningkat. Ini bekerja dengan contoh Anda, di mana urutan yang benar adalah elemen keempat, kedua, pertama, lalu ketiga.

Anda mungkin telah mencari rank, yang mengembalikan peringkat elemen
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
sehingga rankmemberi tahu Anda urutan nomornya, ordermemberi tahu Anda cara mendapatkannya dalam urutan menaik.

plot(a, rank(a)/length(a))akan memberikan grafik CDF. Untuk melihat mengapa orderberguna, coba plot(a, rank(a)/length(a),type="S") yang memberi kekacauan, karena data tidak dalam urutan yang meningkat

Jika Anda melakukannya
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
atau hanya
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
Anda mendapatkan grafik garis CDF.

Saya yakin Anda sedang memikirkan peringkat.

duffymo
sumber
8
Ahh .. aku mengerti sekarang. order () mengembalikan indeks vektor dalam urutan yang diurutkan. Luar biasa, terima kasih banyak.
jeffshantz
order(a, decreasing = T)dan rank(a)akan mengembalikan jawaban yang setara.
omar
Saya mengalami masalah dengan pesanan. a<-c(4,2,1,80,13)Maka order(a)seharusnya 3 4 5 1 2, tetapi anehnya saya mendapatkan3 2 1 5 4
Shoham Debnath
1
@duffymo sedikit bantuan di sini akan sangat dihargai. Kapan rankdan ordersama?
Shoham Debnath
Sebenarnya order(order(a))akan kembali sama seperti rank(a) jika tidak ada ikatan. Jika ada maka akan kembali sama seperti rank(a, ties.method="first").
jac
33

Untuk mengurutkan vektor 1D atau satu kolom data, cukup panggil fungsi sortir dan teruskan dalam urutan Anda.

Di sisi lain, fungsi order diperlukan untuk mengurutkan data data dua dimensi - yaitu, beberapa kolom data yang dikumpulkan dalam matriks atau kerangka data.

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

Berikut adalah kutipan data untuk percobaan gol lapangan di musim NFL 2008, kerangka data yang saya sebut 'fg'. anggaplah 10 titik data ini mewakili semua tujuan lapangan yang dicoba pada tahun 2008; lebih lanjut anggaplah Anda ingin mengetahui jarak dari gol lapangan terpanjang yang dicoba tahun itu, siapa yang menendangnya, dan apakah itu bagus atau tidak; Anda juga ingin mengetahui yang terpanjang kedua, serta yang terpanjang ketiga, dll .; dan akhirnya Anda menginginkan percobaan gol lapangan terpendek.

Nah, Anda bisa melakukan ini:

sort(fg$Dist, decreasing=T)

yang mengembalikan: 50 48 43 37 34 32 26 25 25 20

Itu benar, tapi tidak terlalu berguna - ini memberi tahu kita jarak dari percobaan gol lapangan terpanjang, terpanjang kedua, ... serta terpendek; bagaimanapun, tapi hanya itu yang kami tahu - misalnya, kami tidak tahu siapa kickernya, apakah upaya itu berhasil, dll. Tentu saja, kami membutuhkan seluruh kerangka data yang diurutkan pada kolom "Dist" (dengan kata lain, kami ingin mengurutkan semua baris data pada atribut tunggal Dist . yang akan terlihat seperti ini:

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

Inilah yang dilakukan perintah . Ini adalah 'sort' untuk data dua dimensi; Dengan kata lain, ini mengembalikan indeks integer 1D yang terdiri dari nomor baris sehingga mengurutkan baris sesuai dengan vektor itu, akan memberi Anda pengurutan berorientasi baris yang benar pada kolom, Dist

Begini cara kerjanya. Di atas, sortir digunakan untuk mengurutkan kolom Dist; untuk mengurutkan seluruh kerangka data pada kolom Dist, kami menggunakan 'order' persis dengan cara yang sama seperti 'sort' digunakan di atas :

ndx = order(fg$Dist, decreasing=T)

(Saya biasanya mengikat array yang dikembalikan dari 'order' ke variabel 'ndx', yang merupakan singkatan dari 'index', karena saya akan menggunakannya sebagai array indeks untuk mengurutkan.)

itu adalah langkah 1, inilah langkah 2:

'NDX', apa yang dikembalikan oleh 'semacam' kemudian digunakan sebagai array indeks untuk kembali-order dataframe itu, 'fg':

fg_sorted = fg[ndx,]

fg_sorted adalah urutan ulang kerangka data tepat di atas.

Singkatnya, 'sort' digunakan untuk membuat array indeks (yang menentukan urutan kolom yang ingin Anda sortir), yang kemudian digunakan sebagai array indeks untuk menyusun ulang kerangka data (atau matriks).

doug
sumber
2
-1: urutan masuk akal untuk vektor. Properti dasar keteraturan - bahwa [urutan (a)] diurutkan - tidak dinyatakan dengan jelas.
Jyotirmoy Bhattacharya
3
Salah. Anda perlu melihat lagi - 'properti dasar' memang ditampilkan dengan sangat jelas dalam dua baris kode (latar belakang abu-abu) di atas. Karena pengurutan w / 'order' adalah dua operasi terpisah, saya menunjukkan ini menggunakan dua baris kode - satu membuat vektor indeks dan baris kedua menggunakan indeks itu untuk melakukan pengurutan. OP meminta penjelasan bukan hanya hasil, dan saya memberikan penjelasan kepadanya, terbukti dengan dia memilih jawaban saya dan menulis catatan singkat di atas "Terima kasih [m] akes arti yang sempurna". Saya bahkan mengikat hasil akhir ke variabel yang disebut "fg_sorted".
doug
24

(Saya pikir mungkin akan membantu untuk menguraikan ide dengan sangat sederhana di sini untuk meringkas materi bagus yang diposting oleh @doug, & ditautkan oleh @duffymo; +1 ke masing-masing, btw.)

? order memberi tahu Anda elemen mana dari vektor asli yang perlu diletakkan pertama, kedua, dll., untuk mengurutkan vektor asli, sedangkan ? rank memberi tahu Anda elemen mana yang memiliki nilai terendah, kedua terendah, dll., Sebagai contoh:

> a <- c(45, 50, 10, 96)
> order(a)  
[1] 3 1 2 4  
> rank(a)  
[1] 2 3 1 4  

Begitu order(a)juga dengan mengatakan, 'letakkan elemen ketiga terlebih dahulu saat Anda mengurutkan ...', sedangkan rank(a)mengatakan, 'elemen pertama adalah yang terendah kedua ...'. (Perhatikan bahwa mereka berdua sepakat tentang elemen mana yang paling rendah, dll.; Mereka hanya menyajikan informasi secara berbeda.) Jadi kita melihat bahwa kita dapat menggunakan order()untuk mengurutkan, tetapi kita tidak dapat menggunakan rank()cara itu:

> a[order(a)]  
[1] 10 45 50 96  
> sort(a)  
[1] 10 45 50 96  
> a[rank(a)]  
[1] 50 10 45 96  

Secara umum, order()tidak akan sama rank()kecuali vektor telah diurutkan:

> b <- sort(a)  
> order(b)==rank(b)  
[1] TRUE TRUE TRUE TRUE  

Selain itu, karena order()(pada dasarnya) beroperasi di atas peringkat data, Anda dapat menyusunnya tanpa memengaruhi informasi, tetapi sebaliknya menghasilkan omong kosong:

> order(rank(a))==order(a)  
[1] TRUE TRUE TRUE TRUE  
> rank(order(a))==rank(a)  
[1] FALSE FALSE FALSE  TRUE  
gung - Kembalikan Monica
sumber
1
orderdan ranksebenarnya merupakan kebalikan dari satu sama lain (setidaknya selama nilai di adalamnya unik). Jika Anda membayangkan masing-masing memiliki nama (/ label) ('1', '2', '3', '4') pada nilainya, maka nilai dari order(a)memberi tahu Anda pada posisi apa di rank(a)setiap label terjadi (misalnya nilai pertama dari order(a)(3) memberitahu Anda bahwa '1' terjadi di posisi ke-3 rank(a), dan sebaliknya (misalnya nilai ke-2 dari rank(a)(3) memberi tahu Anda bahwa '2' muncul di posisi ke-3 order(a)). Mereka permutasi terbalik: rank(order(a))= order(rank(a))=1 2 3 4
Glen_b
"? order memberi tahu Anda elemen mana dari vektor asli yang perlu ditempatkan pertama, kedua, dll., untuk mengurutkan vektor asli, sedangkan? rank memberi tahu Anda elemen mana yang memiliki nilai terendah, kedua terendah, dll." Sana. Itu saja yang orang katakan. Akhirnya. Terima kasih!!
AleksandrH
dijelaskan secara ringkas .. apa yang dibutuhkan "? urutan memberi tahu Anda elemen mana dari vektor asli yang perlu ditempatkan pertama, kedua, dll., untuk mengurutkan vektor asli, sedangkan? rank memberi tahu Anda elemen mana yang memiliki terendah, kedua terendah , dll., nilai. "
sHiBuKaLiDhAsAn
9

Menjalankan kode kecil ini memungkinkan saya untuk memahami fungsi order

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

Referensi: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html

adebesin
sumber
1
Hasilnya tidak sesuai dengan masukan. Anda pasti menggunakan yang berbeda xdalam cbind().
Rich Scriven
Telah diubah sehubungan dengan komentar di atas. Semoga ini bisa membantu :)
adebesin
2

Ini bisa membantu Anda di beberapa titik.

a <- c(45,50,10,96)
a[order(a)]

Apa yang Anda dapatkan adalah

[1] 10 45 50 96

Kode yang saya tulis menunjukkan Anda menginginkan "a" sebagai subset keseluruhan dari "a" dan Anda ingin mengurutkan dari nilai terendah hingga tertinggi.

Alejandro Carrera
sumber
2

Dengan kata sederhana, order()memberikan lokasi elemen dengan besaran yang meningkat.

Misalnya, order(c(10,20,30))akan memberi 1,2,3 dan order(c(30,20,10))akan memberi 3,2,1 .

Arnab Jana
sumber
0

mereka mirip tapi tidak sama

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),]
Nick Nassuphis
sumber
rank adalah permutasi terbalik urutan: all(x==x[order(x)][rank(x)])selalu benar. beberapa permutasi adalah kebalikannya, tetapi sebagian besar tidak. invers untuk mengurutkan permutasi yang keluar dari order () adalah rank (). ini menjelaskan mengapa mereka terkadang sama dan terkadang tidak.
Nick Nassuphis