Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Matrix multiplication with scattered NA values

I'm looking to multiply two matrices together in R, one of which may contain randomly placed NA values (i.e., there's no reason they will be all in a row or column), but I still want an output like the example below:

Matrix 1
[1,]      33        45    50
[2,]       NA       NA    54

Matrix 2
[1,] A1               0.0000000        0.0000000
[2,] 0.0000000        A2               0.0000000
[3,] 0.0000000        0.0000000           A3


Result
[1,]      33*A1     45*A2          50*A3
[2,]       NA       NA        (NA*0 +NA*0 +54*A3)=54*A3

Simply doing Matrix1%*%Matrix2 doesn't give what I want for the element in Row 2, Column 3 (it gives NA, which makes sense, but not sure how to do what I'd like it to do). For my purposes, Matrix 2 will never have NA values, if that changes anything.

like image 326
cmc0605 Avatar asked May 14 '13 04:05

cmc0605


2 Answers

Change all occurrences of NA to 0, then do the matrix multiplication:

x <- matrix(c(33, 45, 50, NA, NA, 54), nrow=2, byrow=TRUE)
y <- diag(1:3)


x[is.na(x)] <- 0

x %*% y
     [,1] [,2] [,3]
[1,]   33   90  150
[2,]    0    0  162
like image 75
Andrie Avatar answered Oct 13 '22 02:10

Andrie


To expand on the previous answer and its comment: you can apply the NA pattern of the input matrix into the output matrix.

This works only if input and output matrices are of the same dimension.

x <- matrix(c(33, 45, 50, NA, NA, 54), nrow=2, byrow=TRUE)
y <- diag(1:3)

x0 <- x
x0[is.na(x)] <- 0

z <- x0 %*% y

z[is.na(x)] <- NA

z
     [,1] [,2] [,3]
[1,]   33   90  150
[2,]   NA   NA  162
like image 41
Olivier Delrieu Avatar answered Oct 13 '22 02:10

Olivier Delrieu