Как я могу изменить порядок строк матрицы, data.frame или вектора в соответствии с другим - PullRequest
19 голосов
/ 07 мая 2010
test1 <- as.matrix(c(1, 2, 3, 4, 5))
row.names(test1) <- c("a", "d", "c", "b", "e") 

test2 <- as.matrix(c(6, 7, 8, 9, 10))
row.names(test2) <- c("e", "d", "c", "b", "a") 

  test1
  [,1]
a    1
d    2
c    3
b    4
e    5

 test2
  [,1]
e    6
d    7
c    8
b    9
a   10

Как переупорядочить test2, чтобы строки были в том же порядке, что и test1? например,

 test2
  [,1]
a    10
d    7
c    8
b    9
e    6

Я пытался использовать функцию переупорядочения с: reorder (test1, test2), но не смог понять правильный синтаксис. Я вижу, что переупорядочение занимает вектор, и я здесь использую матрицу. Мои реальные данные имеют один символьный вектор, а другой - data.frame. Я подумал, что структура данных не будет иметь большого значения для этого примера выше, мне просто нужна помощь с синтаксисом и я могу адаптировать его к моей реальной проблеме.

Ответы [ 2 ]

20 голосов
/ 07 мая 2010
test2 <- test2[rownames(test1),,drop=FALSE]
7 голосов
/ 07 мая 2010

После исправления кода, откорректированного для фактического генерирования того, что показывает ваш пример (подсказка: test1 имел имена a, b, c, d, e; вы имели в виду a, d, c, b, 1, как это показано сейчас), это стало проще благодаря match():

R> test2[match(row.names(test2), row.names(test1)),1,drop=FALSE]
  [,1]
a   10
d    7
c    8
b    9
e    6
R> 

Они имеют в виду, что match() делает то, что вы хотите:

R> match(row.names(test2), row.names(test1))
[1] 5 2 3 4 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...