Функция order () в R не дает мне правильных результатов [duplicate]

Просто выполните следующую функцию:

function insert(str, index, value) {
    return str.substr(0, index) + value + str.substr(index);
}

, а затем используйте ее так:

alert(insert("foo baz", 4, "bar "));

Выход: foo bar baz

Он ведет себя точно так же, как C # (Sharp) String.Insert (int startIndex, строковое значение).

ПРИМЕЧАНИЕ. Эта функция вставки вставляет строковое значение (третий параметр) до указанного целочисленного индекса (второго параметра) в string str (первый параметр), а затем возвращает новую строку без изменения str!

68
задан zx8754 20 January 2016 в 14:47
поделиться

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.

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

84
ответ дан duffymo 21 August 2018 в 15:08
поделиться
  • 1
    Ahh .. Теперь я вижу. order () возвращает индексы вектора в отсортированном порядке. Замечательно, спасибо большое. – jeffshantz 23 February 2010 в 03:27
  • 2
    order(a, decreasing = T) и rank(a) вернут эквивалентный ответ. – omar 24 May 2016 в 11:10
  • 3
    У меня проблемы с порядком. a<-c(4,2,1,80,13) Тогда order(a) должно быть 3 4 5 1 2, но странно я получаю 3 2 1 5 4 – Shoham Debnath 27 May 2016 в 11:42
  • 4
    Это позор. – duffymo 27 May 2016 в 11:42
  • 5
    @duffymo небольшая помощь здесь была бы действительно оценена. Когда rank и order одинаковы? – Shoham Debnath 27 May 2016 в 11:45

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

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
ответ дан adebesin 21 August 2018 в 15:08
поделиться
  • 1
    Результат не соответствует входу. Вы, должно быть, использовали x в cbind(). – Rich Scriven 23 September 2016 в 21:51
  • 2
    Исправлено в отношении вышеуказанных комментариев. Надеюсь это поможет :) – adebesin 24 September 2016 в 12:38

Чтобы отсортировать вектор 1D или один столбец данных, просто вызовите функцию sort и передайте в свою последовательность.

С другой стороны, порядок Функция необходима для сортировки данных двух -мерных данных, т. е. нескольких столбцов данных, собранных в матрице или фрейме.

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 года, DataFrame, который я назвал '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

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

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

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

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

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

fg_sorted = fg[ndx,]

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

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

31
ответ дан doug 21 August 2018 в 15:08
поделиться
  • 1
    -1: порядок имеет довольно хороший смысл для вектора. Основное свойство порядка - порядок сортировки [порядок (а)] - явно не указано. – Jyotirmoy Bhattacharya 23 February 2010 в 04:32
  • 2
    Неправильно. вам нужно снова посмотреть - «базовое свойство» действительно показано очень четко в двух (серо-фоновых) строках кода выше. Поскольку сортировка w / 'order' является двумя отдельными операциями, я показал это, используя две строки кода: один создает вектор индекса, а вторую строку использует этот индекс для выполнения сортировки. ОП попросил объяснение не просто результат, и я дал ему его, о чем свидетельствует тот факт, что он выбрал мой ответ и написал краткую записку выше «Спасибо [m] akes perfect sense». Я даже связал конечный результат с переменной, называемой «fg_sorted». – doug 3 April 2010 в 17:19

(я думал, что было бы полезно изложить идеи очень просто здесь, чтобы обобщить хороший материал, отправленный @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  
16
ответ дан gung 21 August 2018 в 15:08
поделиться
  • 1
    order и rank фактически являются инверсиями друг друга (по крайней мере, пока значения в a уникальны). Если вы предполагаете, что у каждого из них есть имена (/ labels) ('1', '2', '3', '4'), то значения order(a) сообщают вам, какая позиция в rank(a) (например, первое значение order(a) (3) говорит вам, что «1» встречается в третьей позиции rank(a) и наоборот (например, второе значение rank(a) (3) сообщает вам, что «2» встречается в третьей позиции order(a)). Это инверсные подстановки: rank(order(a)) = order(rank(a)) = 1 2 3 4 – Glen_b 27 September 2013 в 07:43
  • 2
    «order» указывает, какой элемент исходного вектора нужно поместить первым, вторым и т. д., чтобы отсортировать исходный вектор, тогда как «rank» скажет вам, какой элемент имеет самое низкое, второе низкое и т. д. значение. & Quot; Там. Это все, что нужно было сказать. В заключение. Спасибо!! – AleksandrH 29 December 2017 в 22:03
  • 3
    лаконично объяснил .. что нужно «порядок» говорит вам, какой элемент исходного вектора нужно поставить первым, вторым и т. д., чтобы отсортировать исходный вектор, тогда как «rank» скажет вам, какой элемент имеет самый низкий, второй самый низкий и т. д., значение. & Quot; – sHiBuKaLiDhAsAn 6 March 2018 в 07:25

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

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

0
ответ дан Nuri Katsuki 21 August 2018 в 15:08
поделиться

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

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

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

[1] 10 45 50 96

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

2
ответ дан user6655984 21 August 2018 в 15:08
поделиться
Другие вопросы по тегам:

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