web-dev-qa-db-ja.com

行列、data.frame、またはベクトルの行を別の行に応じて並べ替えるにはどうすればよいですか?

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

行がtest1と同じ順序になるように、test2を並べ替えるにはどうすればよいですか?例えば.

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

Reorder関数をreorder(test1、test2)で使用しようとしましたが、正しい構文を理解できませんでした。リオーダーにはベクトルが必要で、ここでは行列を使用しています。私の実際のデータには、1つの文字ベクトルとdata.frameとしての別の文字ベクトルがあります。上記のこの例では、データ構造はそれほど重要ではないと考えました。構文のヘルプが必要なだけで、実際の問題に適応させることができます。

19
John
test2 <- test2[rownames(test1),,drop=FALSE]
20
Rob Hyndman

あなたの例が示すものを実際に生成するために切り取られたコードを修正した後(ヒント:_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
_
7