我有一个生成如下的矩阵:
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
中应用某些功能?非常感谢!
答案 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)