【问题标题】:Subset a matrix by dimension names in a vector R按向量 R 中的维度名称对矩阵进行子集
【发布时间】:2012-08-21 00:31:02
【问题描述】:

我有一个向量节点名作为

nodenames <- c("A","B","C","T","N","Z")

我有一个稀疏的正方形矩阵,其中暗名称为

Formal class 'dgCMatrix' [package "Matrix"] with 6 slots
  ..@ i       : int [1:4149962] 1 2 3 4 5 9 11 12 13 14 ...
  ..@ p       : int [1:3417] 0 1702 2710 3935 5411 6719 8141 9822 9822 11515 ...
  ..@ Dim     : int [1:2] 3416 3416
  ..@ Dimnames:List of 2
  .. ..$ : chr [1:3416] "A" "B" "AAL" "T" ...
  .. ..$ : chr [1:3416] "A" "B" "AAL" "T" ...
  ..@ x       : num [1:4149962] 2 1 1 3 1 1 2 19 3 2 ...
  ..@ factors : list()

我怎样才能产生这个矩阵的一个子集,在节点名中带有暗名?

【问题讨论】:

  • 来吧汤姆。将其发布为答案。
  • 如果发现“[”没有用 Matrix 对象实现,那将是一个非常大的惊喜。

标签: r matrix sparse-matrix


【解决方案1】:

您可以根据索引号、维度名称(通过字符向量,例如您的nodenames)、逻辑向量以及可能超出我范围的其他内容来对矩阵进行子集化。

mat1[nodenames, nodenames]
  A  B  C  T  N  Z
A 12 22 42 62 72 82
B 13 23 43 63 73 83
C 15 25 45 65 75 85
T 17 27 47 67 77 87
N 18 28 48 68 78 88
Z 19 29 49 69 79 89

或:

mat1[which(rownames(mat1)%in% nodenames), which(colnames(mat1) %in% nodenames)]
mat1[rownames(mat1)%in% nodenames, colnames(mat1) %in% nodenames]

【讨论】:

    【解决方案2】:

    我认为 Tim Riffe 的回答是最直接的。如果用户不确定 'nodenames' 向量是否是 rownames() 和 colnames() 值的子集,那么这可能会更安全一些:

    nodenames <- c("A","ZZ","C","T","N","Z")
    
    seq1 <- seq(1:100)
    mat1 <- matrix(seq1, 10)
    rownames(mat1)<-c("G","A","B","F","C","D","T","N","Z","J")
    colnames(mat1)<-c("G","A","B","F","C","D","T","N","Z","J")
    mat1[rownames(mat1) %in% nodenames, colnames(mat1) %in% nodenames]
    #----------
       A  C  T  N  Z
    A 12 42 62 72 82
    C 15 45 65 75 85
    T 17 47 67 77 87
    N 18 48 68 78 88
    Z 19 49 69 79 89
    

    对于类-dgCMatrix 对象的修正问题,我使用相同的方法得到了合理的结果:

    (m <- Matrix(c(0,0,2:0), 3,5))
    3 x 5 sparse Matrix of class "dgCMatrix"
    
    [1,] . 1 . . 2
    [2,] . . 2 . 1
    [3,] 2 . 1 . .
    
     m@Dimnames <- list(X=letters[1:3], Y=LETTERS[1:5])
     m["a", "B"]
    # [1] 1
     m["a", c("A","B")]
    # A B 
    # 0 1 
    

    【讨论】:

    • 感谢您的回答。抱歉,我没有清楚地描述我的问题。实际上我正在处理稀疏矩阵,简单的子集化方式似乎不起作用。
    • 鉴于我使用相同方法取得的成功,您需要发布一个可重现的示例,以准确说明这是如何“不起作用”。
    • 为我工作。您的示例 @Seen 并不稀疏,但是当类是 Matrix 包的“dgCMatrix”时它可以工作
    • 谢谢。我检查并发现 mat1[nodenames, nodenames] 不起作用,因为某些行名不在节点名中,但 mat1[rownames(mat1) %in% nodenames, colnames(mat1) %in% nodenames] 正在工作。
    • 不子集 dgCMatrix 对象,只是转换为标准矩阵,然后是子集。
    猜你喜欢
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 2018-08-07
    • 1970-01-01
    • 2013-04-07
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多