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?
6 answers
Założę się, że myślisz o randze.Definicja
order
jest taka, żea[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ę elementyR> 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ęcrank
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ć dlaczegoorder
jest jednak przydatna, spróbujplot(a, rank(a)/length(a),type="S")
co daje bałagan, ponieważ dane nie są w rosnącej kolejnościIf you did
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
lub po prostuoo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
otrzymasz wykres liniowy CDF.
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).
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
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
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.
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.
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