Hi Marc.

Thank you for the swift response!  I should have explained more about the 
partitions, I hoped it would be clear from the code.  I am supplying an index 
vector to create the partitions.  In my original example of v = c(1,4,2,6,7,5) 
with v1 = v[1:3], v2 = v[4], v3 = v[5:6], I would specify this partition with 
the index vector c(1,4,5), giving the first indices of each subvector; the 
implicit assumption is that the last index of partition i is the first index of 
partition (i + 1) minus 1, except for the last partition, which ends at the end 
of the original vector being partitioned.  Here are the results of this example 
from the two functions I defined:

> partiCmax(c(1,4,2,6,7,5),c(1,4,5))
[1] 4 6 7
> partiMax(c(1,4,2,6,7,5),c(1,4,5))
[1] 4 6 7
>


However, if I use an example in which the maxima are not non-decreasing:

> partiCmax(6:1,c(1,4,5))
[1] 6 6 6
> partiMax(6:1,c(1,4,5))
[1] 6 3 2
>

partiMax gives the sought result, but partiCmax doesn't.  Your function is like 
a cleaner version of partiMax, using the fact that you have the partition in a 
list.  This begs the question of what is the most efficient way to create the 
partition list from the original vector and the index vector that specifies the 
partition.  But I am also wondering whether we can find something even more 
efficient than the use of the apply family of functions.  Thanks!


--  TMK  --
212-460-5430    home
917-656-5351    cell
t o p k a t z @ m s n . c o m



> Date: Mon, 7 Jan 2008 10:44:20 -0600
> From: [EMAIL PROTECTED]
> To: [EMAIL PROTECTED]
> CC: [EMAIL PROTECTED]
> Subject: Re: [R] Seeking a more efficient way to find partition maxima
>
> 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
>

______________________________________________
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