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

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

Например,

 > a  order(a) [1] 3 1 2 4 

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

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

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

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

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

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

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

 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 

Вот отрывок данных для попыток создания поля в сезоне NFL 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; для сортировки всего кадра данных в столбце «Дист» мы используем «порядок» точно так же, как используется «сортировка» :

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

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

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

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

 fg_sorted = fg[ndx,] 

fg_sorted – это переупорядоченный блок данных непосредственно выше.

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

(Я подумал, что было бы полезно изложить идеи очень просто здесь, чтобы обобщить хороший материал, размещенный @doug, и связанный by @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 

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

 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

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

 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 .

  • Как определить, соответствует ли список точек полигона по часовой стрелке?
  • Давайте будем гением компьютера.