Я пытаюсь понять как order()
функциональные работы. У меня создалось впечатление, что это возвратило перестановку индексов, которые при сортировке отсортируют исходный вектор.
Например,
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
Я ожидал бы, что это возвратится c(2, 3, 1, 4)
, так как отсортированный список был бы 10 45 50 96.
Кто-то может помочь мне понять возвращаемое значение этой функции?
Это, кажется, объясняет это.
Определение
порядка
гласит, что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.
Наверняка вы думаете о ранге.
Сортировка 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 равно переупорядоченный фрейм данных непосредственно выше.
Таким образом, «сортировка» используется для создания индексного массива (который определяет порядок сортировки столбца, который вы хотите отсортировать), который затем используется как индексный массив для изменения порядка фрейма данных (или матрицы).