R - 使用单独矩阵中的排序数据对矩阵中的数据进行排序

时间:2011-10-31 01:56:13

标签: r

我正在尝试使用来自不同矩阵的排名数据在矩阵中对数据进行排序。

我有两个矩阵(X)和(等级)。每个矩阵具有相同数量的列和行。我想使用矩阵(rank)中列的排序数据重新排序矩阵(X)列中的数据。 (X)中的第1列应使用(等级)第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 个答案:

答案 0 :(得分:1)

如果我理解你的问题是正确的,你可能需要这样的东西:

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> 

我不确定您是否要独立重新排序矩阵的每一列。对我来说,这并没有多大意义,因为我们通常会为每个观察行保留矩阵和变量列 - 所以你想要将这些行保持在一起。

但是你可能有不同的需求,我在这里为整个矩阵所做的事情可以按照相同的方式逐列完成。

答案 1 :(得分:0)

这是一个可以帮助您解决此问题的示例

# 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)]
})