Zrozumienie funkcji order ()

88

Próbuję zrozumieć, jak order()działa ta funkcja. Miałem wrażenie, że zwraca permutację indeksów, które po posortowaniu posortowałyby oryginalny wektor.

Na przykład,

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

Spodziewałbym się, że to powróci c(2, 3, 1, 4), ponieważ posortowana lista to 10 45 50 96.

Czy ktoś może mi pomóc zrozumieć wartość zwracaną przez tę funkcję?

jeffshantz
źródło

Odpowiedzi:

100

To wydaje się to wyjaśniać.

Definicja orderjest to, że a[order(a)]jest w porządku rosnącym. Działa to w twoim przykładzie, gdzie prawidłowa kolejność to czwarty, drugi, pierwszy, a potem trzeci element.

Być może szukałeś rank, który zwraca rangę elementów,
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
więc rankmówi ci, w jakiej kolejności są liczby, ordermówi ci, jak uzyskać je w kolejności rosnącej.

plot(a, rank(a)/length(a))da wykres CDF. Aby jednak zobaczyć, dlaczego orderjest to przydatne, spróbuj, plot(a, rank(a)/length(a),type="S") co powoduje bałagan, ponieważ dane nie są w porządku rosnącym

Jeśli tak,
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
lub po prostu
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
otrzymujesz wykres liniowy CDF.

Założę się, że myślisz o randze.

duffymo
źródło
8
Ahh ... teraz rozumiem. order () zwraca indeksy wektora w kolejności posortowanej. Cudownie, bardzo dziękuję.
jeffshantz
order(a, decreasing = T)i rank(a)zwróci równoważną odpowiedź.
omar
Mam problem z zamówieniem. a<-c(4,2,1,80,13)Wtedy order(a)powinno być 3 4 5 1 2, ale dziwnie się dostaję3 2 1 5 4
Shoham Debnath
1
@duffymo, mała pomoc byłaby bardzo wdzięczna. Kiedy jest ranki to ordersamo?
Shoham Debnath
Faktycznie, order(order(a))powróci tak samo jak rank(a) jeśli istnieją żadne powiązania. Jeśli tak, zwróci to samo co rank(a, ties.method="first").
jac
33

Aby posortować wektor 1D lub pojedynczą kolumnę danych, po prostu wywołaj funkcję sortowania i przekaż sekwencję.

Z drugiej strony, kolejność funkcji jest konieczne, aby posortować dane dwa wymiarową danych - tzn wiele kolumn danych zgromadzonych w matrycy lub dataframe.

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

Oto fragment danych dotyczących prób rzutów z gry w sezonie NFL 2008, ramka danych, którą nazwałem „fg”. przypuśćmy, że te 10 punktów danych reprezentuje wszystkie rzuty z gry, które miały miejsce w 2008 roku; ponadto przypuśćmy, że chcesz poznać odległość najdłuższego rzutu do kosza w tym roku, kto go wykopał i czy był dobry, czy nie; chcesz również poznać drugi najdłuższy, trzeci najdłuższy itp .; i na koniec chcesz jak najkrótszej próby rzutu na bramkę.

Cóż, możesz po prostu zrobić to:

sort(fg$Dist, decreasing=T)

co zwraca: 50 48 43 37 34 32 26 25 25 20

To prawda, ale niezbyt przydatne - informuje nas o odległości najdłuższej próby rzutu z gry, drugiej najdłuższej, ... a także najkrótszej; Jednak to wszystko, co wiemy - np. nie wiemy, kto był kickerem, czy próba się powiodła itp. Oczywiście potrzebujemy całej ramki danych posortowanej w kolumnie „Dist” (inaczej mówiąc, musimy chcesz posortować wszystkie wiersze danych według pojedynczego atrybutu Dist ., który wyglądałby tak:

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

To właśnie robi porządek . Jest to „sortowanie” dla danych dwuwymiarowych; innymi słowy, zwraca indeks liczby całkowitej 1D składający się z numerów wierszy, tak że sortowanie wierszy według tego wektora dałoby poprawne sortowanie zorientowane wierszowo na kolumnie, Dist

Oto jak to działa. Powyżej posortowano kolumnę Dist; aby posortować całą ramkę danych w kolumnie Dist, używamy 'order' dokładnie tak samo jak 'sort' powyżej :

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

(Zwykle wiążę tablicę zwróconą z `` kolejności '' ze zmienną `` ndx '', która oznacza `` indeks '', ponieważ zamierzam użyć jej jako tablicy indeksów do sortowania).

to był krok 1, oto krok 2:

'ndx', to, co jest zwracane przez 'sort', jest następnie używane jako tablica indeksów do zmiany kolejności ramki danych, 'fg':

fg_sorted = fg[ndx,]

fg_sorted to ponownie uporządkowana ramka danych bezpośrednio powyżej.

Podsumowując, „sort” służy do tworzenia tablicy indeksów (która określa porządek sortowania kolumny, którą chcesz posortować), która następnie jest używana jako tablica indeksów do zmiany kolejności ramki danych (lub macierzy).

Doug
źródło
2
-1: porządek ma całkiem dobry sens dla wektora. Podstawowa właściwość porządku - to, że [porządek (a)] jest sortowany - nie jest jasno określona.
Jyotirmoy Bhattacharya
2
Źle. trzeba spojrzeć jeszcze raz - „podstawowa właściwość” jest rzeczywiście bardzo wyraźnie pokazana w dwóch (szare tło) wierszach kodu powyżej. Ponieważ sortowanie według kolejności to dwie oddzielne operacje, pokazałem to przy użyciu dwóch wierszy kodu - jednej tworzącej wektor indeksu, a drugiej używającej tego indeksu do sortowania. OP poprosił o wyjaśnienie, a nie tylko wynik, a ja mu je podałem, o czym świadczy fakt, że wybrał moją odpowiedź i napisał krótką notatkę powyżej „Dzięki [m] akes doskonały sens”. Powiązałem nawet wynik końcowy ze zmienną o nazwie „fg_sorted”.
doug
24

(Pomyślałem, że pomocne może być bardzo proste przedstawienie pomysłów tutaj, aby podsumować dobry materiał opublikowany przez @doug i połączony przez @duffymo; +1 do każdego, przy okazji.)

order kolejność mówi ci, który element oryginalnego wektora należy umieścić jako pierwszy, drugi itd., aby posortować oryginalny wektor, a tell rank mówi ci, który element ma najniższą, drugą najniższą itd. wartość. Na przykład:

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

order(a)Mówi się więc , „podczas sortowania umieść trzeci element jako pierwszy…”, podczas gdy rank(a)„pierwszy element jest drugim najniższym…”. (Zauważ, że obaj zgadzają się co do tego, który element jest najniższy itp .; po prostu prezentują informacje inaczej.) Widzimy więc, że możemy użyć order()do sortowania, ale nie możemy użyć w rank()ten sposób:

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

Ogólnie rzecz biorąc, order()nie będzie równy, rank()chyba że wektor został już posortowany:

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

Ponadto, ponieważ order()(zasadniczo) operuje na szeregach danych, możesz je komponować bez wpływu na informacje, ale na odwrót generuje bełkot:

> order(rank(a))==order(a)  
[1] TRUE TRUE TRUE TRUE  
> rank(order(a))==rank(a)  
[1] FALSE FALSE FALSE  TRUE  
gung - Przywróć Monikę
źródło
1
orderi ranksą w rzeczywistości odwrotnością siebie (przynajmniej o ile wartości w asą unikalne). Jeśli wyobrażasz sobie, że każdy z nich miał nazwy (/ etykiety) („1”, „2”, „3”, „4”) przy swoich wartościach, to wartości określają, w order(a)jakiej pozycji w rank(a)każdej etykiecie występuje (np. Pierwsza wartość order(a)(3) mówi, że „1” występuje na 3 pozycji rank(a)i odwrotnie (np. Druga wartość rank(a)(3) mówi, że „2” występuje na trzeciej pozycji w order(a)). Są to permutacje odwrotne: rank(order(a))= order(rank(a))=1 2 3 4
Glen_b,
„? order mówi ci, który element oryginalnego wektora należy umieścić jako pierwszy, drugi itd., aby posortować oryginalny wektor, podczas gdy? rank mówi ci, który element ma najniższą, drugą najniższą itd. wartość”. Tam. To wszystko, co ktoś miał do powiedzenia. Wreszcie. Dziękuję Ci!!
AleksandrH
zwięźle wyjaśniono ... czego potrzeba "? kolejność mówi ci, który element pierwotnego wektora należy umieścić jako pierwszy, drugi itd., aby posortować oryginalny wektor, podczas gdy? rank mówi ci, który element ma najniższy, drugi najniższy element itd., wartość. ”
sHiBuKaLiDhAsAn
9

Uruchomienie tego małego fragmentu kodu pozwoliło mi zrozumieć funkcję zamówienia

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

Źródła: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html

adebesin
źródło
1
Wynik nie pasuje do danych wejściowych. Musiałeś użyć innego xw cbind().
Rich Scriven
Zmieniono w związku z powyższymi uwagami. Mam nadzieję, że to pomoże :)
adebesin
2

W pewnym momencie może ci to pomóc.

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

Dostajesz to

[1] 10 45 50 96

Kod, który napisałem, wskazuje, że chcesz "a" jako cały podzbiór "a" i chcesz, aby było uporządkowane od najniższej do najwyższej wartości.

Alejandro Carrera
źródło
2

W prostych słowach order()podaje lokalizacje elementów o rosnącej wielkości.

Na przykład, order(c(10,20,30))da 1,2,3 i order(c(30,20,10))da 3,2,1 .

Arnab Jana
źródło
0

są podobne, ale nie takie same

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
źródło
ranga jest odwrotną permutacją porządku: all(x==x[order(x)][rank(x)])jest zawsze prawdziwa. niektóre permutacje są odwrotne, ale większość nie. odwrotnością sortowania permutacji wychodzącej poza kolejność () jest rank (). wyjaśnia to, dlaczego czasami są takie same, a innym razem nie.
Nick Nassuphis