Ini sepertinya menjelaskannya.
Definisi dari order
is 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 rank
memberi tahu Anda urutan nomornya,
order
memberi tahu Anda cara mendapatkannya dalam urutan menaik.
plot(a, rank(a)/length(a))
akan memberikan grafik CDF. Untuk melihat mengapa
order
berguna, 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.
order(a, decreasing = T)
danrank(a)
akan mengembalikan jawaban yang setara.a<-c(4,2,1,80,13)
Makaorder(a)
seharusnya3 4 5 1 2
, tetapi anehnya saya mendapatkan3 2 1 5 4
rank
danorder
sama?order(order(a))
akan kembali sama sepertirank(a)
jika tidak ada ikatan. Jika ada maka akan kembali sama sepertirank(a, ties.method="first")
.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 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).
sumber
(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 ...', sedangkanrank(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 menggunakanorder()
untuk mengurutkan, tetapi kita tidak dapat menggunakanrank()
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 samarank()
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
sumber
order
danrank
sebenarnya merupakan kebalikan dari satu sama lain (setidaknya selama nilai dia
dalamnya unik). Jika Anda membayangkan masing-masing memiliki nama (/ label) ('1', '2', '3', '4') pada nilainya, maka nilai dariorder(a)
memberi tahu Anda pada posisi apa dirank(a)
setiap label terjadi (misalnya nilai pertama dariorder(a)
(3) memberitahu Anda bahwa '1' terjadi di posisi ke-3rank(a)
, dan sebaliknya (misalnya nilai ke-2 darirank(a)
(3) memberi tahu Anda bahwa '2' muncul di posisi ke-3order(a)
). Mereka permutasi terbalik:rank(order(a))
=order(rank(a))
=1 2 3 4
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
sumber
x
dalamcbind()
.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.
sumber
Dengan kata sederhana,
order()
memberikan lokasi elemen dengan besaran yang meningkat.Misalnya,
order(c(10,20,30))
akan memberi 1,2,3 danorder(c(30,20,10))
akan memberi 3,2,1 .sumber
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),]
sumber
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.