用向量中的维度名称对矩阵进行子集筛选 R

5
我有一个向量节点名称,格式如下:
nodenames <- c("A","B","C","T","N","Z")

我有一个稀疏的方阵,它的dimnames是

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()

我该如何生成一个带有节点名称维度的矩阵子集?

汤姆,加油。把它作为答案发布。 - IRTFM
如果在Matrix对象中没有实现"[",那将是一个非常大的惊喜。 - IRTFM
2个回答

6
您可以基于索引号、维度名称(通过字符向量,如您的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]

4

我认为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
鉴于我使用相同的方法取得了成功,您需要发布一个可重现的示例,以准确展示这个方法“不起作用”。 - IRTFM
对我来说效果不错。你的示例 @Seen 不是稀疏的,但当类是 Matrix 包中的 "dgCMatrix" 时它可以工作。 - tim riffe
谢谢。我检查了一下,发现mat1 [nodenames,nodenames]无法工作,因为其中一些行名不在nodenames中,但是mat1 [rownames(mat1)%in% nodenames,colnames(mat1)%in% nodenames]可以工作。 - Seen
不会对dgCMatrix对象进行子集操作,只是将其转换为标准矩阵,然后进行子集操作。 - Solomon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接