one approach is the following: mat <- rbind(c(-1, -1, 2, NA), c(3, 3, -2, -1), c(1, 1, NA, -2))
mat / ave(abs(mat), row(mat), sign(mat), FUN = sum) I hope it helps. Best, Dimitris Hao Cen wrote:
Hi, I have a matrix with positive numbers, negative numbers, and NAs. An example of the matrix is as follows -1 -1 2 NA 3 3 -2 -1 1 1 NA -2 I need to compute a scaled version of this matrix. The scaling method is dividing each positive numbers in each row by the sum of positive numbers in that row and dividing each negative numbers in each row by the sum of absolute value of negative numbers in that row. So the resulting matrix would be -1/2 -1/2 2/2 NA 3/6 3/6 -2/3 -1/3 1/2 1/2 NA -2/2 Is there an efficient way to do that in R? One way I am using is 1. rowSums for positive numbers in the matrix 2. rowSums for negative numbers in the matrix 3. sweep(mat, 1, posSumVec, posDivFun) 4. sweep(mat, 1, negSumVec, negDivFun) posDivFun = function(x,y) { xPosId = x>0 & !is.na(x) x[xPosId] = x[xPosId]/y[xPosId] return(x) } negDivFun = function(x,y) { xNegId = x<0 & !is.na(x) x[xNegId] = -x[xNegId]/y[xNegId] return(x) } It is not fast enough though. This scaling is to be applied to large data sets repetitively. I would like to make it as fast as possible. Any thoughts on improving it would be appreciated. Thanks Jeff ______________________________________________ R-help@r-project.org 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.
-- Dimitris Rizopoulos Assistant Professor Department of Biostatistics Erasmus University Medical Center Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands Tel: +31/(0)10/7043478 Fax: +31/(0)10/7043014 ______________________________________________ R-help@r-project.org 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.