Самый эффективный способ сортировки двух векторов в слое в R? - PullRequest
5 голосов
/ 22 февраля 2010

Какой самый эффективный способ сортировки двух векторов в слое в R? Первый вектор должен быть отсортирован в порядке возрастания, а второй должен быть переупорядочен в слое, чтобы элементы с соответствующими индексами до сортировки все еще имели соответствующие индексы после сортировки. Например:

foo <- c(1,3,2, 5,4)
bar <- c(2,6,4,10,8)
sort2(foo, bar)

# foo == c(1,2,3,4, 5)
# bar == c(2,4,6,8,10)

Примечание: Эффективность здесь абсолютно необходима, так как я пытаюсь использовать это как основу для создания O (N log N) реализации Тау Кендалла для отправки в виде патча. Я хотел бы избежать написания своей собственной специальной функции на C, чтобы сделать это, но был бы готов, если это не может быть эффективно выполнено в R.

Ответы [ 2 ]

8 голосов
/ 22 февраля 2010

Не уверен, что понимаю, но это использование order(), что вы хотите:

R> foo <- c(1,3,2, 5,4)
R> bar <- c(2,6,4,10,8)
R> fooind <- order(foo)   # index of ordered 
R> foo[fooind]
[1] 1 2 3 4 5
R> bar[fooind]
[1]  2  4  6  8 10
R> 
0 голосов
/ 14 марта 2016

Я не уверен, что принятый ответ правильный в тех случаях, когда сначала сортируется X, а затем Y сортируется по индексу (отсортированному) X, в том случае, если в X есть повторяющиеся значения, Y не всегда отсортировано в классическом стиле 'order by x, y'. Например:

> x <- c(3,2,2,2,1)
> y <- c(5,4,3,2,1)
> xind <- order(x)
> x[xind]
[1] 1 2 2 2 3
> y[xind]
[1] 1 4 3 2 5

Y - это , упорядоченный по новому порядку X, но не в шаге, так как не все индексы X изменились. Простая функция, необходимая для выполнения операции:

> sort.xy <- function(x,y)
+ {
+ df.xy <- data.frame(x,y)
+ df.xy[ order(df.xy[,1], df.xy[,2]), ]
+ }

Используется:

> c(sort.xy(x,y))
$x
[1] 1 2 2 2 3

$y
[1] 1 2 3 4 5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...