Я пытаюсь понять, как работает функция 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.