Понимание порядка () функция

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

Например,

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

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

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

81
задан Petter Friberg 24 January 2019 в 21:30
поделиться

2 ответа

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

Определение порядка гласит, что a[порядок(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. Чтобы увидеть, почему порядок полезен, попробуйте 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.

Наверняка вы думаете о ранге.

93
ответ дан 24 November 2019 в 09:37
поделиться

Сортировка 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

Вот отрывок данных по попыткам филд-гола в сезоне НФЛ 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 . Это является «сортировкой» для двумерных данных; другими словами, он возвращает одномерный целочисленный индекс, состоящий из номеров строк, так что сортировка строк в соответствии с этим вектором даст вам правильную ориентированную на строки сортировку в столбце, Dist

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

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

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

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

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

fg_sorted = fg[ndx,]

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

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

32
ответ дан 24 November 2019 в 09:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: