【问题标题】:How to move selected matrix rows to top of matrix based on a selection vector of row names如何根据行名的选择向量将选定的矩阵行移动到矩阵的顶部
【发布时间】:2019-08-15 21:28:12
【问题描述】:

我有一个由rowSums() 订购的矩阵。我现在想通过传递行名的 char 向量来选择其中的几行,然后轻松地将它们移回矩阵的顶部 ,同时保持移动的行与它们的顺序相同在选择向量中

我尝试使用subset() 的各种组合或直接选择索引来做到这一点,但我永远无法按照我想要的顺序得到结果矩阵,如果它完全有效的话。我觉得必须有一种更直接的方法来做到这一点。

假设我有一个矩阵matrowSums() 排序:

      sam1 sam2 sam3 sam4 sam5
sig1     1    2    3    4    5
sig2     6    7    8    9   10
sig3    11   12   13   14   15
sig4a   16   17   18   19   20
sig4b   21   22   23   24   25
sig4c   26   27   28   29   30
sig5    31   32   33   34   35
sig6    36   37   38   39   40
sig7a   41   42   43   44   45
aig7b   46   47   48   49   50

我想选择我感兴趣的行数:

select = c('sig6','sig4a','sig2')

并将它们移回矩阵的顶部,同时保持它们在select向量中的顺序,同时将剩余未选中的行留在它们下方以获得新矩阵:

      sam1 sam2 sam3 sam4 sam5
sig6    36   37   38   39   40 *
sig4a   16   17   18   19   20 *
sig2     6    7    8    9   10 *
sig1     1    2    3    4    5
sig3    11   12   13   14   15
sig4b   21   22   23   24   25
sig4c   26   27   28   29   30
sig5    31   32   33   34   35
sig7a   41   42   43   44   45
aig7b   46   47   48   49   50

有没有一种不涉及制作中间矩阵或复杂解决方法的简单方法?似乎应该有,但我一直无法找到解决方案。也许我忽略了一些东西。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    一个选项是先指定行名称的向量,然后是 setdiff 留下的行名称

    mat[c(select, setdiff(row.names(mat), select)),]
    #.     sam1 sam2 sam3 sam4 sam5
    #sig6    36   37   38   39   40
    #sig4a   16   17   18   19   20
    #sig2     6    7    8    9   10
    #sig1     1    2    3    4    5
    #sig3    11   12   13   14   15
    #sig4b   21   22   23   24   25
    #sig4c   26   27   28   29   30
    #sig5    31   32   33   34   35
    #sig7a   41   42   43   44   45
    #aig7b   46   47   48   49   50
    

    数据

    mat <- structure(c(1L, 6L, 11L, 16L, 21L, 26L, 31L, 36L, 41L, 46L, 2L, 
    7L, 12L, 17L, 22L, 27L, 32L, 37L, 42L, 47L, 3L, 8L, 13L, 18L, 
    23L, 28L, 33L, 38L, 43L, 48L, 4L, 9L, 14L, 19L, 24L, 29L, 34L, 
    39L, 44L, 49L, 5L, 10L, 15L, 20L, 25L, 30L, 35L, 40L, 45L, 50L
    ), .Dim = c(10L, 5L), .Dimnames = list(c("sig1", "sig2", "sig3", 
    "sig4a", "sig4b", "sig4c", "sig5", "sig6", "sig7a", "aig7b"), 
        c("sam1", "sam2", "sam3", "sam4", "sam5")))
    

    【讨论】:

    • 谢谢,这行得通。我希望有一种更简单的方法来做到这一点,尽管像 move(c('row6','row7'), c(1,2)) 或类似的东西。
    • @Leo。你可以用setdiff创建一个函数,让它更简单
    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多