[R] How to sum only a few elements in a line
David Winsemius
dwinsemius at comcast.net
Wed Nov 25 23:23:26 CET 2009
On Nov 25, 2009, at 3:45 PM, William Dunlap wrote:
>> -----Original Message-----
>> From: r-help-bounces at r-project.org
>> [mailto:r-help-bounces at r-project.org] On Behalf Of Marcio Resende
>> Sent: Wednesday, November 25, 2009 12:27 PM
>> To: r-help at 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
More information about the R-help
mailing list