对矩阵中的所有列进行排名,然后使用秩对不同的矩阵重新排序

时间:2013-07-26 18:56:55

标签: r

我有一个包含4列的矩阵x

x <- structure(c(53L, 48L, 51L, 1012L, 59L, 55L, 27L, 27L, 21L,
  1905L, 20L, 24L, 21L, 20L, 21L, 258L, 22L, 25L, 23L, 27L, 16L,
  1900L, 24L, 21L), .Dim = c(6L, 4L))

我有一个具有相同尺寸的其他矩阵Y

Y <- structure(c(-9, -7, -6.25, -6.25, -6, -5.75, -9, -7, -6.25,
  -6.25, -6, -5.75, -9, -7, -6.25, -6.25, -6, -5.75, -9, -7, -6.25,
  -6.25, -6, -5.75), .Dim = c(6L, 4L))

我想对矩阵x中的列进行排名,并根据这些排名对矩阵Y中的列重新排序。我尝试在矩阵x中对列进行排名:

rank1 <- rank(x, ties.method= "first") # this does not give me column by column
rank1 <- rank(x[,1], ties.method= "first") # this gives individual column only

我有没有办法对x中的所有列进行排名,然后使用Y中的等级重新排序x中的单个列?

2 个答案:

答案 0 :(得分:3)

使用apply将函数应用于每列:

X = matrix(rnorm(24), 6, 4)
Y = matrix(rnorm(24), 6, 4)

x.order = apply(X ,2, rank)

# alternatively, you can specify a ties method thusly:
x.order = apply(X,2, function(x){rank(x, ties.method="first")})

# now to reorder Y: 
sapply(1:ncol(Y), function(i){
  Y[x.order[,i],i]
}
       )

答案 1 :(得分:2)

您可以将两个矩阵绑定到一个数组中,并仅循环使用apply

a <- array(c(x, y), dim=c(dim(x),2))
apply(a, 2, function(m) m[,2][rank(m[,1], ties.method= "first")])

#      [,1]  [,2]  [,3]  [,4]
#[1,] -6.25 -6.25 -7.00 -6.25
#[2,] -9.00 -6.00 -9.00 -6.00
#[3,] -7.00 -7.00 -6.25 -9.00
#[4,] -5.75 -5.75 -5.75 -5.75
#[5,] -6.00 -9.00 -6.25 -6.25
#[6,] -6.25 -6.25 -6.00 -7.00