[R] Sum over indexed value

cls59 chuck at sharpsteen.net
Mon Nov 16 20:39:35 CET 2009



Gunadi wrote:
> 
> I am sure this is easy but I am not finding a function to do this. 
> 
> I have two columns in a matrix. The first column contains multiple entries
> of numbers from 1 to 100 (i.e. 10 ones, 8 twos etc.). The second column
> contains unique numbers. I want to sum the numbers in column two based on
> the indexed values in column one (e.g. sum of all values in column two
> associated with the value 1 in column one). I would like two columns in
> return - the indexed value in column one (i.e. this time no duplicates)
> and the sum in column two. 
> 
> How do I do this? 
> 


Supposing you had the data:

  tstData <- data.frame( index = c(1,2,1,1,3,2), 
    value = c( 0, 4, 0, 0, 7, 4 ) )

You could use the by() function to divide the data.frame and sum the value
column:

  sums <- by( tstData, tstData[['index']], function( slice ){

    return( sum( slice[['value']] ) )

  })

However, by() tends to do a poor job of cleanly expressing which values of
'index' generated the sums.  I would recomend the __ply() functions in
Hadley Wickham's plyr package.  Specifically ddply():

  require( plyr )

  sums <- ddply( tstData, 'index', function( slice ){

    return(
      data.frame( sum = sum( slice[['value']] ) )
    )
  })

  sums
   index sum
  1     1   0
  2     2   8
  3     3   7


Hope this helps!

-Charlie

-----
Charlie Sharpsteen
Undergraduate
Environmental Resources Engineering
Humboldt State University
-- 
View this message in context: http://old.nabble.com/Sum-over-indexed-value-tp26376359p26378112.html
Sent from the R help mailing list archive at Nabble.com.




More information about the R-help mailing list