Order () işlevini anlama


89

order()İşlevin nasıl çalıştığını anlamaya çalışıyorum. Sıralandığında orijinal vektörü sıralayacak olan bir indis permütasyonu döndürdüğü izlenimindeydim.

Örneğin,

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

c(2, 3, 1, 4)Sıralanan liste 10 45 50 96 olacağından bunun geri dönmesini beklerdim.

Birisi bu işlevin dönüş değerini anlamama yardımcı olabilir mi?

Yanıtlar:


101

Bu onu açıklıyor gibi görünüyor.

Nedir orderIS a[order(a)]düzeni arttırılmasıdır. Bu, doğru sıranın dördüncü, ikinci, birinci, ardından üçüncü öğe olduğu örneğinizle çalışır.

Aramış olabilirsiniz rank, bu da elementlerin sırasını döndürür,
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
böylece ranksayıların hangi sırada olduğunu ordersöyler , onları artan sırada nasıl elde edeceğinizi söyler.

plot(a, rank(a)/length(a))CDF'nin bir grafiğini verecektir. Neden orderyararlı olduğunu görmek için , plot(a, rank(a)/length(a),type="S") hangisinin sorun yarattığını deneyin , çünkü veriler artan sırada değil

Yaptıysanız
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
veya basitçe
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
CDF'nin çizgi grafiğini alırsanız.

Bahse girerim rütbeyi düşünüyorsundur.


8
Ahh .. Şimdi anlıyorum. order (), vektörün dizinlerini sıralı düzende döndürür. Harika, çok teşekkürler.
jeffshantz

order(a, decreasing = T)ve rank(a)eşdeğer bir cevap döndürecektir.
omar

Düzenle ilgili sorun yaşıyorum. a<-c(4,2,1,80,13)O zaman order(a)olmalı 3 4 5 1 2, ama garip bir şekilde anlıyorum3 2 1 5 4
Shoham Debnath

1
@duffymo burada küçük bir yardım gerçekten takdir edilecektir. Ne zaman rankve orderaynı?
Shoham Debnath

Aslında, sanki hiç bağ yokmuş order(order(a))gibi geri dönecektir . Varsa, aynı şekilde geri dönecektir . rank(a) rank(a, ties.method="first")
jac

33

Bir 1B vektörü veya tek bir veri sütununu sıralamak için , sadece sıralama işlevini çağırın ve sıranızı iletin.

Öte yandan, sipariş fonksiyonu verileri çözmek için gerekli olan iki Bir matris veya bir dataframe toplanan verilerin, yani çok sayıda sütun - boyutlu verileri.

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

İşte 2008 NFL sezonundaki saha gol girişimleri için bir veri parçası, 'fg' adını verdiğim bir veri çerçevesi. bu 10 veri noktasının 2008'de denenen tüm saha hedeflerini temsil ettiğini varsayalım; ayrıca, o yıl atılan en uzun saha golünün mesafesini, kimin attığını ve iyi olup olmadığını bilmek istediğinizi varsayalım; ayrıca en uzun ikinci ve üçüncü en uzun olanı vb. bilmek istersiniz; ve son olarak en kısa saha golü denemesini istiyorsunuz.

Peki, bunu yapabilirsin:

sort(fg$Dist, decreasing=T)

döndürür: 50 48 43 37 34 32 26 25 25 20

Bu doğru, ancak pek kullanışlı değil - bize en uzun saha golü denemesinin mesafesini, ikinci en uzun olanı ve en kısa olanı söylüyor; ancak, ancak tek bildiğimiz bu - örneğin, vurucunun kim olduğunu, denemenin başarılı olup olmadığını bilmiyoruz, vb. Elbette, "Dist" sütununda sıralanmış tüm veri çerçevesine ihtiyacımız var (başka bir deyişle, biz Dağılım tek özelliğindeki tüm veri satırlarını aşağıdaki gibi sıralamak istiyorsanız :

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

Bu, emrin yaptığı şeydir . İki boyutlu veriler için "sırala" dır; Başka bir deyişle, satır numaralarından oluşan bir 1B tamsayı indeksi döndürür, böylece satırları o vektöre göre sıralamak size sütunda doğru satır odaklı sıralama verir, Dist

İşte nasıl çalıştığı. Yukarıda, sıralama Dist sütunu sıralamak için kullanıldı; Dist sütunundaki tüm veri çerçevesini sıralamak için, yukarıda "sırala" nın kullanıldığı şekilde "sıralama" yı kullanırız :

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

(Genellikle 'sıra'dan döndürülen diziyi' dizin 'anlamına gelen' ndx 'değişkenine bağlarım, çünkü onu sıralamak için bir dizin dizisi olarak kullanacağım.)

bu 1. adımdı, işte 2. adım:

'ndx', 'sıralama' ile döndürülen şey daha sonra veri çerçevesini yeniden sıralamak için bir dizin dizisi olarak kullanılır , 'fg':

fg_sorted = fg[ndx,]

fg_sorted, hemen üstündeki yeniden sıralanan veri çerçevesidir.

Özetle, 'sıralama', daha sonra veri çerçevesini (veya matrisi) yeniden düzenlemek için bir dizin dizisi olarak kullanılan bir dizin dizisi (sıralamak istediğiniz sütunun sıralama düzenini belirtir) oluşturmak için kullanılır.


2
-1: düzen bir vektör için oldukça mantıklı. Siparişin temel özelliği - bir [sipariş (a)] sıralı - açıkça belirtilmemiştir.
Jyotirmoy Bhattacharya

3
Yanlış. tekrar bakmanız gerekir - 'temel özellik' aslında yukarıdaki iki (gri arka plan) kod satırında çok net bir şekilde gösterilmektedir. 'Sıralı' sıralama iki ayrı işlem olduğundan, bunu iki satır kod kullanarak gösterdim - biri indeks vektörünü oluştururken ikinci satır sıralamayı gerçekleştirmek için bu indeksi kullanıyor. OP sadece bir sonuç değil bir açıklama istedi ve cevabımı seçip yukarıdaki kısa notu yazdığı gerçeğinin kanıtladığı gibi ona bir açıklama verdim "Teşekkürler mükemmel anlam". Hatta nihai sonucu "fg_sorted" adlı bir değişkene bağladım.
doug

24

(@Doug tarafından gönderilen ve her birine @duffymo; +1 ile bağlanan iyi materyali özetlemek için burada fikirleri çok basit bir şekilde düzenlemenin yararlı olabileceğini düşündüm.)

? sırası size oysa orijinal vektör sıralamak için böylece, vb, ikinci ilk koymak gerekmektedir orijinal vektör hangi öğenin söyler kaçıncı sırada? düşük, ikinci en düşük vb değeri vardır hangi eleman söyleyecektir. Örneğin:

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

Öyleyse order(a), 'sıraladığınızda ilk önce üçüncü öğeyi koyun ...' rank(a)derken, 'ilk öğe ikinci en düşüktür ...' diyor. (Her ikisinin de hangi öğenin en düşük olduğu konusunda hemfikir olduklarına dikkat edin; sadece bilgiyi farklı şekilde sunarlar.) Böylece order(), sıralama için kullanabileceğimizi görüyoruz , ancak rank()bu şekilde kullanamayız :

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

Genel olarak, vektör zaten sıralanmadıkça order()eşit rank()olmayacaktır:

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

Ayrıca, order()(esasen) verilerin sıralamaları üzerinde çalıştığından, bunları bilgileri etkilemeden oluşturabilirsiniz, ancak bunun tersi anlamsızdır:

> order(rank(a))==order(a)  
[1] TRUE TRUE TRUE TRUE  
> rank(order(a))==rank(a)  
[1] FALSE FALSE FALSE  TRUE  

1
orderve rankaslında birbirinin tersidir (en azından içindeki değerler abenzersiz olduğu sürece ). Her birinin değerlerinde adların (/ etiketlerinin) ('1', '2', '3', '4') olduğunu hayal ederseniz, o zaman değerleri order(a)size rank(a)her bir etikette hangi konumda bulunduğunu söyler (örn. order(a)(3) size '1'in 3. konumunda rank(a)ve bunun tersi rank(a)olduğunu söyler (örneğin (3)' ün 2. değeri size '2'nin 3. konumunda oluştuğunu söyler order(a)). Ters permütasyonlardır: rank(order(a))= order(rank(a))=1 2 3 4
Glen_b

"? sıra, orijinal vektörü sıralamak için orijinal vektörün hangi öğesinin birinci, ikinci vb. olarak yerleştirilmesi gerektiğini söylerken? rank, hangi öğenin en düşük, ikinci en düşük vb. değere sahip olduğunu söyler." Orada. Herkesin söylemesi gereken bu. En sonunda. Teşekkür ederim!!
AleksandrH

kısa ve öz bir şekilde açıklandı. Birinin neye ihtiyacı var? sıralaması, orijinal vektörü sıralamak için orijinal vektörün hangi elemanının birinci, ikinci vb. olarak yerleştirilmesi gerektiğini söylerken? rank, hangi elemanın en düşük, ikinci en düşük olduğunu söyler , vb., değer. "
sHiBuKaLiDhAsAn

9

Bu küçük kod parçasını çalıştırmak, sipariş işlevini anlamamı sağladı

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

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


1
Sonuç, girişle eşleşmiyor. Farklı bir xin kullanmış olmalısın cbind().
Rich Scriven

Yukarıdaki açıklamalara göre değiştirilmiştir. Umarım bu yardımcı olur :)
adebesin

2

Bu size bir noktada yardımcı olabilir.

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

Ne alırsın

[1] 10 45 50 96

Yazdığım kod, "a" yı "a" nın bir alt kümesi olarak istediğinizi ve en düşük değerden en yüksek değere doğru sıralanmasını istediğinizi gösteriyor.


2

Basit bir deyişle, order()artan büyüklükteki öğelerin yerlerini verir.

Örneğin 1,2,3order(c(10,20,30)) verir ve 3,2,1 verir .order(c(30,20,10))


0

benzerler ama aynı değiller

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),]

rank, düzenin ters permütasyonudur: all(x==x[order(x)][rank(x)])her zaman doğrudur. bazı permütasyonlar kendilerinin tersidir, ancak çoğu değildir. sırayla () gelen permütasyonun tersi rank (). bu onların neden bazen aynı olduğunu ve bazen olmadığını açıklar.
Nick Nassuphis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.