【问题标题】:Subset matrix using vector of indices in R使用 R 中的索引向量的子集矩阵
【发布时间】:2020-05-25 17:50:39
【问题描述】:

我在尝试理解代码时遇到了一些问题。我有一个代码,它应该加载到矩阵中,并在下面的列中调用顶部的 n 功能。

TopFeatures <- function(matrix, ncols = 1, nfeatures = 20){
   mtx <- matrix[ , ncols, drop = FALSE]
   data <- mtx[order(mtx, decreasing = TRUE), , drop = FALSE]
   features <- head(x = rownames(x = data), n = nfeatures
   return(features)
} 

但是,每当我尝试超过 1 列时,我都会收到如下错误。

> TopFeatures(so, ncols = 1:3, nfeatures = 10)
Error in mtx[order(mtx, decreasing = TRUE), , drop = FALSE] : 
  subscript out of bounds

我相信错误来自这一行:

data <- mtx[order(mtx, decreasing = TRUE), , drop = FALSE]

但是,我真的不明白这条线应该做什么。

我的理解是,这里的目的是对矩阵中的所有单元格进行排序,然后按降序排序,然后挑出最靠前的n 特征。函数order 对您的矩阵进行排序并返回一个索引向量,该向量等于矩阵中单元格的数量,但您不能使用索引向量进行子集化,因为该数字将超过行数。我想这就是为什么我有这个错误。但是,我不知道如何解决这个问题。

有人可以指导我如何解决这个问题吗?

非常感谢。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    您应该order 仅基于一列。因此,当您拥有一列时,它可以工作,但当您拥有多于一列时,它就不起作用。

    假设第一列是你想order你的数据,你可以试试:

    TopFeatures <- function(matrix, ncols = 1, nfeatures = 20){
       mtx <- matrix[ , ncols, drop = FALSE]
       data <- mtx[order(mtx[, 1], decreasing = TRUE), , drop = FALSE]
       features <- head(x = rownames(data), n = nfeatures)
       return(features)
    } 
    

    在这一行

    mtx[order(mtx, decreasing = TRUE), , drop = FALSE]
    

    您正在尝试根据mtx 矩阵中的值排列行。

    假设您有一个单列矩阵。

    mtx <- matrix(1:10)
    data <- mtx[order(mtx, decreasing = TRUE), , drop = FALSE] #gives
    data
    
    #      [,1]
    # [1,]   10
    # [2,]    9
    # [3,]    8
    # [4,]    7
    # [5,]    6
    # [6,]    5
    # [7,]    4
    # [8,]    3
    # [9,]    2
    #[10,]    1
    

    而使用 2 列矩阵,您会得到:

    mtx <- matrix(1:10, ncol = 2)
    data <- mtx[order(mtx, decreasing = TRUE), , drop = FALSE]
    

    mtx[order(mtx, reduction = TRUE), , drop = FALSE] 中的错误: 下标越界

    即因为

    order(mtx, decreasing = TRUE) #returns
    #[1] 10  9  8  7  6  5  4  3  2  1
    

    但您的数据中只有 5 行,因此出现错误。

    如果你 order 只在第一列,你会得到

    order(mtx[, 1], decreasing = TRUE)
    #[1] 5 4 3 2 1
    

    这不会给你一个子集错误。

    【讨论】:

    • 是的,我知道它适用于一列。但我认为原始脚本打算对整个矩阵进行排序,而不仅仅是使用 1 列。 附言。矩阵中的所有值都是数字。
    • 好的,谢谢。我明白你的解释。但是该脚本最初是这样编写的,并且声称可以工作。所以我不知道错误在哪里,因为我不确定他们是否只想将它安排在第一列。无论如何,您是否知道如何对整个矩阵进行排序 - 即矩阵中的所有值然后对它们进行排序并再次将它们作为矩阵返回?我的意思是,矩阵本质上是一个有维度的向量,所以我假设你可以对矩阵中的所有值进行排序。不?如果我错了,请纠正我。感谢您的及时回复!!!
    • 如果你想order整个矩阵我不明白为什么有人会使用这条线mtx[order(mtx, decreasing = TRUE), , drop = FALSE]。您能否通过示例确认您正在努力实现的目标并显示预期的输出。如果我们都不知道我们要达到什么目标,而我们只是在黑暗中拍摄,那么我可能会删除答案。
    • 对不起,我不能举个例子,因为这不是我的脚本。但我认为它是这样的:
    • 为了解释,我正在简化它,但这个矩阵是一个巨大的细胞与基因矩阵,矩阵中的值是表达值。所以,假设你有一个这样的矩阵:mat(c(1,5,-11,0), nrow = 2,然后排列矩阵中的所有单元格,以便顺序为5, 1, 0, -11,然后提取这些单元格的行名。
    猜你喜欢
    • 2020-03-02
    • 1970-01-01
    • 2022-11-02
    • 2016-05-18
    • 1970-01-01
    • 2013-04-07
    • 2016-04-24
    • 1970-01-01
    • 2015-12-09
    相关资源
    最近更新 更多