R - Сортировка данных в матрице с использованием ранжированных данных в отдельной матрице - PullRequest
2 голосов
/ 31 октября 2011

Я пытаюсь упорядочить данные в матрице, используя ранжированные данные из другой матрицы, используя R.

У меня есть две матрицы (X) и (rank).Каждая матрица имеет одинаковое количество столбцов и строк.Я хотел бы изменить порядок данных в столбцах из матрицы (X), используя ранжированные данные из столбцов в матрице (rank).Столбец 1 в (X) должен быть упорядочен с использованием ранжированных данных из столбца 1 в (ранг).

Я искал в Интернете пару дней и ничего не нашел.Я был бы признателен за любую помощь.

Пример:

Матрица (X)

Col1: A, B, C, D, E

Col2: A, B, C, D, E

Матрица (ранг)

Col1: 2,4,5,3,1

Col2: 3,2,4,1, 5

Матрица целей (X.rank)

Col1: B, D, E, C, A

Col2: C, B, D, A, E

Еще раз спасибо.

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Если я правильно понимаю ваш вопрос, вы можете захотеть что-то вроде этого:

R> X <- matrix(c(1:10, (1:10)^2), 10, 2, byrow=FALSE)
R> rank <- seq(10,1,by=-1)    # simple decreasing rank
R> X
      [,1] [,2]
 [1,]    1    1
 [2,]    2    4
 [3,]    3    9
 [4,]    4   16
 [5,]    5   25
 [6,]    6   36
 [7,]    7   49
 [8,]    8   64
 [9,]    9   81
[10,]   10  100
R> X[rank,]
      [,1] [,2]
 [1,]   10  100
 [2,]    9   81
 [3,]    8   64
 [4,]    7   49
 [5,]    6   36
 [6,]    5   25
 [7,]    4   16
 [8,]    3    9
 [9,]    2    4
[10,]    1    1
R> 

Я не уверен, хотите ли вы изменить порядок каждого столбца матрицы независимо. Для меня это не имеет особого смысла, так как мы обычно храним матрицы с строками на наблюдение и столбцами для переменных - так что вы захотите сохранить строки вместе.

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

0 голосов
/ 31 октября 2011

Вот пример, который может помочь вам с этой проблемой

# vector
x = rnorm(5)

# ranks
y = sample(5)

# sort vector based on ranks
x[match(sort(y), y)]

Вы можете обернуть это вокруг apply вызова для работы со всей матрицей. Обратите внимание, что это может быть не самым эффективным решением. Поэтому, если у вас большая матрица, сообщите об этом людям, чтобы решение было более сфокусированным.

EDIT. Вот расширенный пример, который упаковывает вызов в sapply для достижения того же для матрицы.

x = matrix(rnorm(10), ncol = 2)  # original matrix to sort
y = cbind(sample(5), sample(5))  # rank matrix for sort order
sapply(1:NCOL(x), function(i) {
  .x = x[,i]; .y = y[,i]
  .x[match(sort(.y), .y)]
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...