Это , кажется, объяснить.
Определение order
- это то, что a[order(a)]
находится в порядке возрастания. Это работает с вашим примером, где правильный порядок - четвертый, второй, первый, затем третий элементы.
Возможно, вы искали rank
, что возвращает ранг элементов,
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
поэтому rank
сообщает вам, в каком порядке расположены числа,
order
говорит вам, как получить их в порядке возрастания.
plot(a, rank(a)/length(a))
даст график CDF. Чтобы понять, почему
order
это полезно, попробуйте, plot(a, rank(a)/length(a),type="S")
что дает беспорядок, потому что данные не в порядке возрастания
Если вы это сделали
oo<-order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
или просто
oo<-order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
вы получите линейный график CDF.
Готов поспорить, вы думаете о звании.
order(a, decreasing = T)
иrank(a)
вернет эквивалентный ответ.a<-c(4,2,1,80,13)
Тогдаorder(a)
должно быть3 4 5 1 2
, но, как ни странно, я получаю3 2 1 5 4
rank
иorder
такое же?order(order(a))
вернется так же, какrank(a)
если бы галстуков не было. Если есть, то он вернется так же, какrank(a, ties.method="first")
.Чтобы отсортировать одномерный вектор или отдельный столбец данных, просто вызовите функцию сортировки и передайте свою последовательность.
С другой стороны, порядок функции необходимо сортировать данные два мерных данных - то есть, несколько столбцов данных , собранных в матрице или 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
Вот отрывок данных по попыткам филд-гола в сезоне НФЛ 2008 года, фрейм данных, который я назвал «fg». предположим, что эти 10 точек данных представляют все полевые цели, поставленные в 2008 году; далее предположим, что вы хотите узнать расстояние, на которое была заброшена самая длинная игра с игры в этом году, кто его забил, и было ли это хорошим или нет; вы также хотите знать, кто является вторым по длине, а также третьим по длине и т. д .; и, наконец, вам нужна самая короткая попытка броска с игры.
Что ж, вы могли бы просто сделать это:
sort(fg$Dist, decreasing=T)
который возвращает: 50 48 43 37 34 32 26 25 25 20
Это правильно, но не очень полезно - оно говорит нам о расстоянии самой длинной попытки броска с игры, второй по длине, ... а также самой короткой; однако, это все, что мы знаем - например, мы не знаем, кто был виноват, была ли попытка успешной и т. д. Конечно, нам нужен весь фрейм данных, отсортированный по столбцу «Dist» (другими словами, мы хотите отсортировать все строки данных по одному атрибуту Dist ., который будет выглядеть следующим образом:
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
Вот что делает заказ . Это «сортировка» двумерных данных; Другими словами, он возвращает 1D целочисленный индекс, состоящий из номеров строк, так что сортировка строк в соответствии с этим вектором даст вам правильную ориентированную на строки сортировку по столбцу, Dist
Вот как это работает. Выше, вроде был использован для сортировки Dist колонки; чтобы отсортировать весь фрейм данных в столбце Dist, мы используем «порядок» точно так же, как «сортировка» используется выше :
ndx = order(fg$Dist, decreasing=T)
(Обычно я привязываю массив, возвращаемый из 'order', к переменной 'ndx', что означает 'index', потому что я собираюсь использовать его как массив индексов для сортировки.)
это был шаг 1, вот шаг 2:
'ndx', то, что возвращает 'sort', затем используется в качестве массива индексов для изменения порядка фрейма данных 'fg':
fg_sorted - это переупорядоченный фрейм данных непосредственно выше.
Таким образом, «сортировка» используется для создания индексного массива (который определяет порядок сортировки столбца, который вы хотите отсортировать), который затем используется как индексный массив для изменения порядка фрейма данных (или матрицы).
источник
(Я подумал, что было бы полезно изложить здесь идеи очень просто, чтобы обобщить хороший материал, опубликованный @doug и связанный @duffymo; +1 к каждому, кстати.)
? order сообщает вам, какой элемент исходного вектора нужно поставить первым, вторым и т. д., чтобы отсортировать исходный вектор, тогда как ? rank сообщает вам, какой элемент имеет наименьшее, второе низшее и т.д. значение. Например:
> a <- c(45, 50, 10, 96) > order(a) [1] 3 1 2 4 > rank(a) [1] 2 3 1 4
Так
order(a)
говорится: «Поместите третий элемент первым при сортировке ...», в то времяrank(a)
как говорится: «Первый элемент является вторым самым низким ...». (Обратите внимание, что они оба согласны с тем, какой элемент самый низкий и т. Д.; Они просто по-разному представляют информацию.) Таким образом, мы видим, что мы можем использоватьorder()
для сортировки, но не можем использоватьrank()
этот способ:> a[order(a)] [1] 10 45 50 96 > sort(a) [1] 10 45 50 96 > a[rank(a)] [1] 50 10 45 96
В общем
order()
случае не будет равно,rank()
если вектор еще не отсортирован:> b <- sort(a) > order(b)==rank(b) [1] TRUE TRUE TRUE TRUE
Кроме того, поскольку
order()
он (по сути) работает с рядами данных, вы можете составлять их, не влияя на информацию, но наоборот, производит тарабарщину:> order(rank(a))==order(a) [1] TRUE TRUE TRUE TRUE > rank(order(a))==rank(a) [1] FALSE FALSE FALSE TRUE
источник
order
иrank
фактически инвертируют друг друга (по крайней мере, пока значения вa
них уникальны). Если вы представите, что у каждого из них есть имена (/ label) ('1', '2', '3', '4') в их значениях, тогда значенияorder(a)
говорят вам, какая позиция вrank(a)
каждой метке встречается (например, 1-е значениеorder(a)
(3) сообщает вам, что «1» встречается в 3-й позицииrank(a)
, и наоборот (например, 2-е значениеrank(a)
(3) говорит вам, что «2» встречается в 3-й позицииorder(a)
). Это обратные перестановки:rank(order(a))
=order(rank(a))
=1 2 3 4
Запуск этого небольшого фрагмента кода позволил мне понять функцию заказа
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
Ссылка: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html
источник
x
incbind()
.В какой-то момент это может вам помочь.
a <- c(45,50,10,96) a[order(a)]
Вы получаете
[1] 10 45 50 96
Код, который я написал, указывает, что вам нужно "a" как целое подмножество "a", и вы хотите, чтобы оно было упорядочено от наименьшего к наибольшему значению.
источник
Проще говоря,
order()
дает расположение элементов возрастающей величины.Например,
order(c(10,20,30))
даст 1,2,3 иorder(c(30,20,10))
даст 3,2,1 .источник
они похожи, но не одинаковы
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),]
источник
all(x==x[order(x)][rank(x)])
всегда верно. некоторые перестановки обратны сами себе, но большинство - нет. перестановка, обратная сортировке, выходящая из порядка (), - это rank (). это объясняет, почему они иногда одинаковы, а другие нет.