[R] Seeking a more efficient way to find partition maxima

Marc Schwartz marc_schwartz at comcast.net
Mon Jan 7 17:44:20 CET 2008


Talbot Katz wrote:
> Hi.
> 
> Suppose I have a vector that I partition into disjoint, contiguous
> subvectors.  For example, let v = c(1,4,2,6,7,5), partition it into
> three subvectors, v1 = v[1:3], v2 = v[4], v3 = v[5:6].  I want to
> find the maximum element of each subvector.  In this example, max(v1)
> is 4, max(v2) is 6, max(v3) is 7.  If I knew that the successive
> subvector maxima would never decrease, as in the example, I could do
> the following:
> 
> partiCmax <- function( values, seriesIdx ) { # assume seriesIdx is
> increasing integer sequence beginning with 1, ending at less than or
> equal to length(values) parti <- cbind( seriesIdx, c( ( seriesIdx[ -1
> ] - 1 ), length( values ) ) ) return( cummax( values )[ parti[ , 2 ]
> ] ) }
> 
> 
> The use of cummax makes that pretty efficient, but if the subvector
> maxima are not non-decreasing, it doesn't work.  The following
> function works (at least it did on the examples I tried):
> 
> partiMax <- function( values, seriesIdx ) { # assume seriesIdx is
> increasing integer sequence beginning with 1, ending at less than or
> equal to length(values) parti <- cbind( seriesIdx, c( ( seriesIdx[ -1
> ] - 1 ), length( values ) ) ) return( sapply( ( 1:length(seriesIdx)
> ), function ( i ) {return( max( values[ parti[ i, 1 ]:parti[ i, 2 ] ]
> ) ) } ) ) }
> 
> 
> but I figured someone out there could come up with something
> cleverer.  Thanks!

It is not clear how you are creating the partitions, but if you are 
(hopefully) ending up with a list, such as:

 > Vec.List
$v1
[1] 1 4 2

$v2
[1] 6

$v3
[1] 7 5


Then you can use:

 > sapply(Vec.List, max, na.rm = TRUE)
v1 v2 v3
  4  6  7


See ?sapply for more information.

HTH,

Marc Schwartz




More information about the R-help mailing list