Zrozumienie funkcji order ()

Próbuję zrozumieć, jak działa funkcja order(). 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 powróci c(2, 3, 1, 4), ponieważ lista posortowana będzie wynosić 10 45 50 96.

Czy ktoś może mi pomóc zrozumieć wartość zwracaną tej funkcji?

Author: Gregor, 2010-02-23

6 answers

To chyba wyjaśnia.

Definicja order jest taka, że a[order(a)] jest w zwiększam zamówienie. Działa to na twoim przykładzie, gdzie prawidłowe porządek jest czwartym, drugim, pierwszym, a następnie trzecim elementem.

Być może szukałeś rank, co zwraca rangę elementy
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 rank mówi ci, w jakiej kolejności są liczby, order mówi ci, jak je zdobyć w rosnącym spokój.

plot(a, rank(a)/length(a)) da Wykres CDF. Aby zobaczyć dlaczego order jest jednak przydatna, spróbuj plot(a, rank(a)/length(a),type="S") co daje bałagan, ponieważ dane nie są w rosnącej kolejności

If you did
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")
otrzymasz wykres liniowy CDF.

Założę się, że myślisz o randze.
 85
Author: duffymo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-18 17:06:57

Aby posortować wektor 1D lub pojedynczą kolumnę danych, wystarczy wywołać Sortuj funkcja i przekazać w sekwencji.

Z drugiej strony, zamówienie funkcja jest niezbędna do sortowania danych dwóch -wymiarowych danych--tj. wielu kolumn danych zebranych w macierzy lub ramce danych.

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 dla field goal prób w sezonie 2008 NFL, ramka danych nazwałem 'fg'. Załóżmy, że te 10 punktów danych reprezentują wszystkie ponadto Załóżmy, że chcesz znać odległość najdłuższego gola, który próbował tego roku, kto go kopnął i czy był dobry, czy nie; chcesz również wiedzieć drugi najdłuższy, a także trzeci najdłuższy itp.; i wreszcie chcesz najkrótszą próbę field goal.

Możesz to zrobić:
sort(fg$Dist, decreasing=T)

Który zwraca: 50 48 43 37 34 32 26 25 25 20

To jest poprawne, ale niezbyt przydatne-mówi nam o odległości z najdłuższej próby bramkowej, drugiej-najdłuższej, ... a także najkrótszej; jednak, ale to wszystko, co wiemy-np. nie wiemy, kto był kopaczem, czy próba się powiodła itp. Oczywiście cały dataframe musimy posortować w kolumnie "Dist" (inaczej mówiąc, chcemy posortować wszystkie wiersze danych na jednym atrybutie Dist. to by wyglądało 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 order . to "sortowanie" dla danych dwuwymiarowych; umieść inny sposób, zwraca indeks 1D składający się z liczb wierszy, tak aby sortowanie wierszy według tego wektora dało prawidłowe sortowanie wierszy w kolumnie, Dist

Oto jak to działa. Powyżej, sort został użyty do sortowania kolumny Dist; aby posortować całą ramkę danych w kolumnie Dist, używamy 'order' dokładnie tak samo jak 'sort' jest użyty powyżej :
ndx = order(fg$Dist, decreasing=T)

(Zwykle wiążę tablicę zwróconą z 'order' do zmiennej 'ndx', która stojaki dla 'index', ponieważ zamierzam użyć go jako tablicy indeksów do sortowania.)

To był Krok 1, oto krok 2:

'NDX', co jest zwracane przez 'sort' jest następnie używane jako tablica indeksowa do ponownego uporządkowania ramki danych, 'fg':

fg_sorted = fg[ndx,]

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

W sumie, 'sort' jest używany do tworzenia tablicy indeksów (która określa kolejność sortowania kolumny, którą chcesz posortować), która następnie jest używana jako tablica indeksów do ponownego uporządkowania dataframe (lub matrix).

 31
Author: doug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-27 05:23:56

(pomyślałem, że może być pomocne, aby rozłożyć pomysły bardzo prosto tutaj, aby podsumować dobry materiał opublikowany przez @ doug, & linked by @ duffymo ;+ 1 do każdego, btw.)

?kolejność mówi, który element oryginalnego wektora należy umieścić jako pierwszy, drugi itd., aby posortować oryginalny wektor, natomiast ?ranga powiedz, który element ma najniższy, drugi najniższy itp., wartość. Na przykład:

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

Więc order(a) mówi: "postaw trzeci element pierwszy podczas sortowania... ", natomiast rank(a) mówi: "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ć rank() w 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ówne rank(), chyba że wektor został już posortowany:

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

Również, ponieważ order() jest (zasadniczo) działa nad szeregami danych, można komponuj je 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  
 16
Author: gung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-25 01:41:03

Uruchomienie tego fragmentu kodu pozwoliło mi zrozumieć funkcję porządkową

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

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

 5
Author: adebesin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-24 12:37:27

To może Ci kiedyś pomóc.

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

To co 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ł uporządkowany od najniższej do najwyższej wartości.

 2
Author: Alejandro Carrera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 01:11:06

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

Na przykład order(c(10,20,30)) Da 1,2,3 oraz order(c(30,20,10)) DA 3,2,1.

 0
Author: Arnab Jana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-09 10:23:46