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

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

Например,

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

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

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

Ответ 1

Это, похоже, объясняет это.

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

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

Ответ 2

Чтобы отсортировать вектор 1D или один столбец данных, просто вызовите функцию 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

Вот отрывок данных для попыток создания поля в сезоне 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", которая стоит для 'index', потому что я собираюсь использовать его как массив индексов для сортировки.)

который был шагом 1, здесь шаг 2:

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

fg_sorted = fg[ndx,]

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

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

Ответ 3

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

Ответ 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

Ответ 5

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

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

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

[1] 10 45 50 96

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

Ответ 6

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

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