如何根据另一个对矩阵,data.frame或向量的行重新排序

时间:2010-05-07 03:24:30

标签: r dataframe matrix vector

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的顺序相同? e.g。

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

我尝试使用重新排序功能:reorder(test1,test2)但我无法弄清楚正确的语法。我看到重新排序需要一个向量,我在这里使用矩阵。我的真实数据有一​​个字符向量,另一个是data.frame。我认为数据结构对于上面这个例子来说并不重要,我只需要帮助解决语法问题,并使其适应我的实际问题。

2 个答案:

答案 0 :(得分:20)

test2 <- test2[rownames(test1),,drop=FALSE]

答案 1 :(得分:7)

修复你的代码后修剪实际生成你的示例显示的内容(提示: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