代码之家  ›  专栏  ›  技术社区  ›  alittleboy

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

  •  1
  • alittleboy  · 技术社区  · 12 年前

    我生成了一个矩阵,如下所示:

    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
    

    现在,假设我想对每一行 垫子 从最小到最大, 但根据一些团体指数 。如您所见,共有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
    

    有没有一种方法可以通过传递 垫子 grp.ids 以获得排序后的矩阵 材料b ? 在中应用一些函数 plyr ? 谢谢!

    3 回复  |  直到 12 年前
        1
  •  3
  •   flodel    12 年前

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

    sort.vec <- function(x, grp.ids) ave(x, grp.ids, FUN = sort)
    t(apply(mat.a, 1, sort.vec, grp.ids))
    
        2
  •  2
  •   IRTFM    12 年前
     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
    
        3
  •  1
  •   eddi    12 年前
    matrix(unlist(lapply(split(mat.a, 1:nrow(mat.a)),
                         function(row) tapply(row, grp.ids, sort))),
           nrow = nrow(mat.a), byrow = TRUE)