根据R中的一些组索引对矩阵进行排序

时间:2013-04-16 21:55:05

标签: r plyr

我有一个生成如下的矩阵:

set.seed(999)
mat.a = matrix(round(rnorm(24,4,9)),3,8)
mat.a

mat.a看起来像这样:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    6  -13   -6   12   -8   12   10
[2,]   -8    2   -7   16    6    5  -15    1
[3,]   11   -1   -5    5   13    5   -7    7

现在,假设我想将mat.a的每一行从最小到最大,排序,但根据某些组索引。如您所见,有8列,对应于

grp.ids = as.factor(c(1,1,1,2,2,2,3,3))

即,前3列用于组1,后3列用于组2,后两列用于组3.所需要的是对每组进行排序所以结果是一个矩阵(称之为mat.b),如下所示:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]  -13    1    6   -8   -6   12   10   12
[2,]   -8   -7    2    5    6   16  -15    1
[3,]   -5   -1   11    5    5   13   -7    7

有没有办法通过传递mat.agrp.ids来获得排序矩阵mat.b来有效地编写函数?在plyr中应用某些功能?非常感谢!

3 个答案:

答案 0 :(得分:3)

您可以编写一个函数,然后将其应用于每一行:

sort.vec <- function(x, grp.ids) ave(x, grp.ids, FUN = sort)
t(apply(mat.a, 1, sort.vec, grp.ids))

答案 1 :(得分:2)

 t( apply(mat.a, 1, function(row) row[order(c(1,1,1,2,2,2,3,3), row)] ) )
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]  -13    1    6   -8   -6   12   10   12
[2,]   -8   -7    2    5    6   16  -15    1
[3,]   -5   -1   11    5    5   13   -7    7

答案 2 :(得分:1)

matrix(unlist(lapply(split(mat.a, 1:nrow(mat.a)),
                     function(row) tapply(row, grp.ids, sort))),
       nrow = nrow(mat.a), byrow = TRUE)