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

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

75 голосов
/ 23 февраля 2010

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

Например,

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

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

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

Ответы [ 6 ]

91 голосов
/ 23 февраля 2010

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

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

Держу пари, ты думаешь о ранге.

31 голосов
/ 23 февраля 2010

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

С другой стороны, функция order необходима для сортировки данных двух -мерных данных, т.е. нескольких столбцов данных, собранных в матрице или фрейм данных.

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

Это то, что делает order . Это 'sort' для двумерных данных; другими словами, он возвращает 1D целочисленный индекс, состоящий из номеров строк, так что сортировка строк в соответствии с этим вектором даст вам правильную ориентированную на строки сортировку по столбцу, Dist

Вот как это работает. Выше sort использовался для сортировки столбца Dist; чтобы отсортировать весь фрейм данных в столбце Dist, мы используем 'order' точно так же, как 'sort' используется выше :

ndx = order(fg$Dist, decreasing=T)

(я обычно связываю массив, возвращенный из 'order', с переменной 'ndx', которая стоит для «индекса», потому что я собираюсь использовать его как массив индекса для сортировки.)

это был шаг 1, вот шаг 2:

'ndx', то, что возвращает 'sort', затем используется в качестве индексного массива для переупорядочения кадра данных, 'fg':

fg_sorted = fg[ndx,]

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

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

19 голосов
/ 25 февраля 2013

(я подумал, что было бы полезно очень просто изложить идеи здесь, чтобы суммировать хороший материал, опубликованный @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  
6 голосов
/ 24 сентября 2016

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

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

2 голосов
/ 23 мая 2017

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

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

То, что вы получаете

[1] 10 45 50 96

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

1 голос
/ 09 августа 2017

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

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

...