Subset a matrix by dimension names in a vector R
matrix, r, sparse-matrix
Solution
I think Tim Riffe's answer is the most direct. If the user were unsure whether the 'nodenames' vector were a subset of both the rownames() and the colnames() values, then this might be a bit safer:
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
For the amended question for objects of class-dgCMatrix I am getting sensible results using the same methods:
(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
Problem
I have a vector nodenames as ``` nodenames <- c("A","B","C","T","N","Z") ``` I have a square sparse matrix with dimnames as ``` 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() ``` How can I produce a subset of this matrix with dimnames in nodenames?