我正在尝试使用来自不同矩阵的排名数据在矩阵中对数据进行排序。
我有两个矩阵(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
再次感谢。
答案 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)]
})