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


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

например,

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

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

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

6 68

6 ответов:

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

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

вот выдержка из данных для полевых попыток в сезоне НФЛ 2008 года, фрейм данных, который я назвал "fg". предположим, что эти 10 точек данных представляют все полевые цели, предпринятые в 2008 году; далее предположим, что вы хотите знать расстояние самой длинной полевой цели, предпринятой в этом году, кто ее ударил, и было ли это хорошо или нет; вы также Хотите знать вторую самую длинную, а также третью самую длинную и т. д.; и, наконец, вы хотите самую короткую попытку цели поля.

(я подумал, что было бы полезно изложить идеи очень просто здесь,чтобы суммировать хороший материал, опубликованный @doug, & связанный @duffymo; +1 к каждому, кстати.)

?порядок говорит вам, какой элемент исходного вектора должен быть поставлен первым, вторым и т. д., чтобы отсортировать исходный вектор, тогда как ?ранг скажите вам, какой элемент имеет самый низкий, второй самый низкий и т. д., значение. Например:

> 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  

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

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.