1

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

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.a有没有办法通过传递和grp.ids获取排序矩阵来有效地编写函数mat.b?在 ? 中应用一些功能plyr?非常感谢!

4

3 回答 3

3

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

sort.vec <- function(x, grp.ids) ave(x, grp.ids, FUN = sort)
t(apply(mat.a, 1, sort.vec, grp.ids))
于 2013-04-16T22:08:01.440 回答
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
于 2013-04-16T23:30:09.750 回答
1
matrix(unlist(lapply(split(mat.a, 1:nrow(mat.a)),
                     function(row) tapply(row, grp.ids, sort))),
       nrow = nrow(mat.a), byrow = TRUE)
于 2013-04-16T22:20:33.707 回答