To wydaje się to wyjaśniać.
Definicja order
jest 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 rank
mówi ci, w jakiej kolejności są liczby,
order
mówi ci, jak uzyskać je w kolejności rosnącej.
plot(a, rank(a)/length(a))
da wykres CDF. Aby jednak zobaczyć, dlaczego
order
jest 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.
order(a, decreasing = T)
irank(a)
zwróci równoważną odpowiedź.a<-c(4,2,1,80,13)
Wtedyorder(a)
powinno być3 4 5 1 2
, ale dziwnie się dostaję3 2 1 5 4
rank
i toorder
samo?order(order(a))
powróci tak samo jakrank(a)
jeśli istnieją żadne powiązania. Jeśli tak, zwróci to samo corank(a, ties.method="first")
.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 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).
źródło
(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 gdyrank(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ć wrank()
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
źródło
order
irank
są w rzeczywistości odwrotnością siebie (przynajmniej o ile wartości wa
są 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ą, worder(a)
jakiej pozycji wrank(a)
każdej etykiecie występuje (np. Pierwsza wartośćorder(a)
(3) mówi, że „1” występuje na 3 pozycjirank(a)
i odwrotnie (np. Druga wartośćrank(a)
(3) mówi, że „2” występuje na trzeciej pozycji worder(a)
). Są to permutacje odwrotne:rank(order(a))
=order(rank(a))
=1 2 3 4
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
źródło
x
wcbind()
.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.
źródło
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 iorder(c(30,20,10))
da 3,2,1 .źródło
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),]
źródło
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.