Martin Waller
2007-Nov-12 21:54 UTC
[R] update matrix with subset of it where only row names match
I guess this has a simple solution: I have matrix 'mat1' which has row and column names, e.g.: A B C row1 0 0 0 row2 0 0 0 .... rown 0 0 0 I have a another matrix 'mat2', essentially a subset of 'mat1' where the rownames are all in 'mat1' e.g.: B row3 5 row8 6 row54 7 I want to insert the values of matrix mat2 for column B (in reality it could be some or all of column names A, B or C, etc.) (same name in both matrices if that matters - rownames of mat2 guaranteed to be in mat1) into matrix mat1 where the rownames match, so final desired result is: matrix mat1: A B C row1 0 0 0 row2 0 0 0 row3 0 5 0 ... row8 0 6 0 ... row54 0 7 0 .. rown 0 0 0 My solution was (along the lines of): mat1[rownames(mat2)%in%rownames(mat1),"B"]=mat2[,"B"] Is there a better way? It doesn't 'feel' right? Thanks - hope I explained it right (its late and I had a little drink about an hour ago,etc....). Martin
jim holtman
2007-Nov-13 00:54 UTC
[R] update matrix with subset of it where only row names match
Here is one way of doing it that uses the row and column names:> # create test data > mat1 <- matrix(0, nrow=10, ncol=3) > dimnames(mat1) <- list(paste('row', 1:10, sep=''), LETTERS[1:3]) > mat2 <- matrix(1:3, ncol=1, dimnames=list(c('row3', 'row7', 'row5'), "B")) > mat2B row3 1 row7 2 row5 3> # create indexing matrix > indx <- cbind(match(rownames(mat2), rownames(mat1)), match(colnames(mat2), colnames(mat1))) > indx[,1] [,2] [1,] 3 2 [2,] 7 2 [3,] 5 2> mat1[indx] <- mat2 > mat1A B C row1 0 0 0 row2 0 0 0 row3 0 1 0 row4 0 0 0 row5 0 3 0 row6 0 0 0 row7 0 2 0 row8 0 0 0 row9 0 0 0 row10 0 0 0 On Nov 12, 2007 4:54 PM, Martin Waller <martinej.waller at ntlworld.com> wrote:> I guess this has a simple solution: > > I have matrix 'mat1' which has row and column names, e.g.: > > A B C > row1 0 0 0 > row2 0 0 0 > .... > rown 0 0 0 > > I have a another matrix 'mat2', essentially a subset of 'mat1' where the > rownames are all in 'mat1' e.g.: > > B > row3 5 > row8 6 > row54 7 > > > I want to insert the values of matrix mat2 for column B (in reality it > could be some or all of column names A, B or C, etc.) (same name in both > matrices if that matters - rownames of mat2 guaranteed to be in mat1) > into matrix mat1 where the rownames match, so final desired result is: > > matrix mat1: > A B C > row1 0 0 0 > row2 0 0 0 > row3 0 5 0 > ... > row8 0 6 0 > ... > row54 0 7 0 > .. > rown 0 0 0 > > My solution was (along the lines of): > > mat1[rownames(mat2)%in%rownames(mat1),"B"]=mat2[,"B"] > > Is there a better way? It doesn't 'feel' right? > > Thanks - hope I explained it right (its late and I had a little drink > about an hour ago,etc....). > > > Martin > > ______________________________________________ > R-help at r-project.org mailing list > stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve?