On Nov 25, 2009, at 3:45 PM, William Dunlap wrote:

-----Original Message-----
From: r-help-boun...@r-project.org
[mailto:r-help-boun...@r-project.org] On Behalf Of Marcio Resende
Sent: Wednesday, November 25, 2009 12:27 PM
To: r-help@r-project.org
Subject: [R] How to sum only a few elements in a line


Hello,

I have a matrix with the numbers 0,1 and 9
I would like to write a function that could sum each line
skiping everytime
a number 9 appears
for example
[0 1 0 1 1 9 1]
the sum would be 4.
However I cannot replace 9 by 0 otherwise after the sum is
done I wouldn´t
be able to distiguish which ones were real zeros and which
ones were nines
replaced by zero just to sum.

One of the nice things about the S language is
that arguments functions are not altered by the
function.  When the function appears to alter
an argument it is really altering a copy of it.
Thus you can write a function like
   f <- function(matrix) {
       matrix[matrix==9] <- 0
       rowSums(matrix)
   }
and use it as
myMatrix <- rbind(c(0,1,0,1,1,9,1), c(9,9,9,9,9,17,9))
f(myMatrix)
   [1]  4 17

How about using the element-wise behavior of "*" when working with matrices?

> rowSums( myMatrix*(myMatrix != 9) )
[1]  4 17

myMatrix # not altered by running f over it
        [,1] [,2] [,3] [,4] [,5] [,6] [,7]
   [1,]    0    1    0    1    1    9    1
   [2,]    9    9    9    9    9   17    9

By the way, it would help if you wrote your example data
as an S expression, e.g., rbind(c(...),c(...)), and not
as an expression in some other language, "[ 1 1 9 ]".

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com

Thank you very much

--


David Winsemius, MD
Heritage Laboratories
West Hartford, CT

______________________________________________
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.

Reply via email to