Ted Harding wrote: > >>> Is there any way to "force" 0 * NA to be 0 instead of NA? >> >> No (AFAIK), and it is pretty reasonable to define it this way. >> If you want to treat the NAs as zeros, use >> x[is.na(x)] <- 0 > > Doing it in precisely that way would have the problem that it > would not give you NA when it should. For example: > > x <- c(1, NA, 1) > wt <- c(2, 1, 1) > > Then, after x[is.na(x)] <- 0, the result of x %*% wt should be NA, > but your method would give 3. > That's precisely my thought - since you may have read my thoughts, it's time to recalibrate my alluminium helmet.
But I also thought about something else. What is the meaning of NA? NA is a _missing_ value, and is.infinite(NA) returns FALSE [OTOH, is.finite(NA) returns FALSE too - this is weird]. A missing value times zero is zero. OTOH, 1/NA is NA, so NA could mean Inf. Maybe binary logic can't adequately handle such ideas :-/ if (NA == 0) is NA, then is.finite(NA) should be NA too... if (NA == 0) 2 else 3 # gives an error > This is why I suggested a method > which tests for corresponding elements of x = NA and y = 0, since > what Alberto Monteiro wanted was 0*NA = 0, when that combination > occures. I.e. > > "%*NA%" <- function(x,y){ > X<-x;X[(is.na(x))&(y==0)]<-0; > Y<-y;Y[(is.na(y))&(x==0)]<-0; > return(X%*%Y) > } > This method is fine. I had already done something similar Of course, the problem begins to grow if we want, for example, to use elementary matrices to transform a matrix. The 2x2 matrix that switches two lines, rbind(c(0,1), c(1,0)) will not switch a matrix with NAs: switch <- rbind(c(0,1), c(1,0)) testmatrix <- rbind(c(1,2,3,4), c(5,6,7,8)) switch %*% testmatrix # ok testmatrix[2,2] <- NA switch %*% testmatrix # not ok But I digress... Alberto Monteiro ______________________________________________ R-help@stat.math.ethz.ch mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.