Понимание функции order ()

88

Пытаюсь понять, как order()работает функция. У меня создалось впечатление, что он вернул перестановку индексов, которая при сортировке сортирует исходный вектор.

Например,

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

Я ожидал, что это вернется c(2, 3, 1, 4), так как отсортированный список будет 10 45 50 96.

Может ли кто-нибудь помочь мне понять возвращаемое значение этой функции?

Джеффшанц
источник

Ответы:

100

Это , кажется, объяснить.

Определение 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.

Готов поспорить, вы думаете о звании.

Duffymo
источник
8
Ааа .. Теперь понятно. order () возвращает индексы вектора в отсортированном порядке. Замечательно, большое спасибо.
jeffshantz
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
Шохам Дебнатх
1
@duffymo, небольшая помощь здесь была бы очень признательна. Когда есть rankи orderтакое же?
Шохам Дебнатх
Собственно order(order(a))вернется так же, как rank(a) если бы галстуков не было. Если есть, то он вернется так же, как rank(a, ties.method="first").
jac
33

Чтобы отсортировать одномерный вектор или отдельный столбец данных, просто вызовите функцию сортировки и передайте свою последовательность.

С другой стороны, порядок функции необходимо сортировать данные два мерных данных - то есть, несколько столбцов данных , собранных в матрице или 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 = fg[ndx,]

fg_sorted - это переупорядоченный фрейм данных непосредственно выше.

Таким образом, «сортировка» используется для создания индексного массива (который определяет порядок сортировки столбца, который вы хотите отсортировать), который затем используется как индексный массив для изменения порядка фрейма данных (или матрицы).

дуг
источник
2
-1: порядок имеет смысл для вектора. Основное свойство порядка - сортировка [порядок (а)] - четко не указано.
Джйотирмой Бхаттачарья
2
Неправильно. вам нужно посмотреть еще раз - «основное свойство» действительно очень четко показано в двух строках кода (на сером фоне) выше. Поскольку сортировка с «порядком» - это две отдельные операции, я показал это с помощью двух строк кода: одна создает индексный вектор, а вторая строка использует этот индекс для выполнения сортировки. ОП попросил объяснение, а не просто результат, и я дал ему один, о чем свидетельствует тот факт, что он выбрал мой ответ и написал краткую заметку выше: «Спасибо [m] akes perfect». Я даже привязал конечный результат к переменной под названием «fg_sorted».
Дуг
24

(Я подумал, что было бы полезно изложить здесь идеи очень просто, чтобы обобщить хороший материал, опубликованный @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  
gung - Восстановить Монику
источник
1
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
Glen_b
«? order сообщает вам, какой элемент исходного вектора необходимо поставить первым, вторым и т. д., чтобы отсортировать исходный вектор, тогда как? rank сообщает вам, какой элемент имеет наименьшее, второе наименьшее и т.д. значение». Там. Это все, что нужно было сказать. В заключение. Спасибо!!
AleksandrH
кратко объяснено ... что нужно? »порядок сообщает вам, какой элемент исходного вектора нужно поставить первым, вторым и т. д., чтобы отсортировать исходный вектор, тогда как? rank сообщает вам, какой элемент имеет наименьший, второй наименьший и т. д., ценность. "
sHiBuKaLiDhAsAn
9

Запуск этого небольшого фрагмента кода позволил мне понять функцию заказа

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

адебезин
источник
1
Результат не соответствует вводу. Вы, должно быть, использовали другой xin cbind().
Rich Scriven
Изменено с учетом приведенных выше комментариев. Надеюсь, это поможет :)
adebesin
2

В какой-то момент это может вам помочь.

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

Вы получаете

[1] 10 45 50 96

Код, который я написал, указывает, что вам нужно "a" как целое подмножество "a", и вы хотите, чтобы оно было упорядочено от наименьшего к наибольшему значению.

Алехандро Каррера
источник
2

Проще говоря, order()дает расположение элементов возрастающей величины.

Например, order(c(10,20,30))даст 1,2,3 и order(c(30,20,10))даст 3,2,1 .

Арнаб Яна
источник
0

они похожи, но не одинаковы

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 (). это объясняет, почему они иногда одинаковы, а другие нет.
Ник Нассуфис