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.