[R] Continuous columns of matrix

William Dunlap wdunlap at tibco.com
Sat May 25 00:25:52 CEST 2013


Are you trying to identify the highest point in each run of points higher than a threshold,
akin to the problem of naming mountains so that each minor bump on a high ridge does not
get its own name?  The following does that:

f <- function (x, threshold = 0.8 * max(x), plot=FALSE) 
{
    if (plot) { plot(x, type="l") ; abline(h=threshold) }
    big <- x > threshold
    n <- length(big)
    startRunOfBigs <- which(c(big[1], !big[-n] & big[-1]))
    if (plot) abline(v=startRunOfBigs, col="green")
    endRunOfBigs <- which(c(big[-n] & !big[-1], big[n]))
    if (plot) abline(v=endRunOfBigs, col="red")
    stopifnot(length(startRunOfBigs) == length(endRunOfBigs),
              all(startRunOfBigs <= endRunOfBigs))
    index <- vapply(seq_along(startRunOfBigs),
                    function(i)which.max(x[startRunOfBigs[i]:endRunOfBigs[i]])+startRunOfBigs[i]-1L,
                    0L)
    if (plot && length(index)>0) points(cex=1.5, index, x[index])
    data.frame(Index=index, Value=x[index])
}

E.g., with your data:
> x <- c(0.563879907485297, 0.749077642331436, 0.681023650957497, 1.30140773002346, 
  1.46377246795771, 1.20312609775816, 0.651886452442823, 0.853749099839423, 
  1.041608733313, 0.690719733451964, 1.49415144965002, 1.30559703478921
  )
> f(x, plot=TRUE) # the plot illustrates what it is doing
  Index    Value
1     5 1.463772
2    11 1.494151

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: r-help-bounces at r-project.org [mailto:r-help-bounces at r-project.org] On Behalf
> Of eliza botto
> Sent: Friday, May 24, 2013 2:10 PM
> To: ruipbarradas at sapo.pt; r-help at r-project.org
> Subject: Re: [R] Continuous columns of matrix
> 
> Dear Rui,
> Regarding your last reply there is a small additional question which i want to ask. For the
> following column
> > dput(mat[,1])c(0.563879907485297, 0.749077642331436, 0.681023650957497,
> 1.30140773002346, 1.46377246795771, 1.20312609775816, 0.651886452442823,
> 0.853749099839423, 1.041608733313, 0.690719733451964, 1.49415144965002,
> 1.30559703478921)
> Your loop gives following results
>            [,1]     [,2]     [,3]      [,4]
> index  4.000000 5.000000 6.000000 11.000000
> values 1.301408 1.463772 1.203126  1.494151
> which is very accurate. Index 11 had the maximum value and 4,5,6 were the neibhours. i
> want to add an other condition which is that if a column has more
> than 1 neibhours, than just like the maximum value, those neibhour can not be next to
> each other as well.
> So what i should have is the following
>     [,1]     [,2]
> index   5.000000 11.000000
> values  1.463772   1.494151
> Is there anyway of doing it??
> Thanks in advance
> Elisa
> 
> > Date: Fri, 24 May 2013 17:02:56 +0100
> > From: ruipbarradas at sapo.pt
> > To: eliza_botto at hotmail.com
> > CC: bhh at xs4all.nl; r-help at r-project.org
> > Subject: Re: [R] Continuous columns of matrix
> >
> > Hello,
> >
> > No problem. Just change <0 to >= and Inf to -Inf:
> >
> > fun2 <- function(x){
> > 	n <- length(x)
> > 	imx <- which.max(x)
> > 	if(imx == 1){
> > 		x[2] <- x[n] <- -Inf
> > 	}else if(imx == n){
> > 		x[1] <- x[n - 1] <- -Inf
> > 	}else{
> > 		x[imx - 1] <- -Inf
> > 		x[imx + 1] <- -Inf
> > 	}
> > 	index <- which(x >= 0.8*x[imx])
> > 	values <- x[index]
> > 	list(index = index, values = values)
> > }
> >
> > apply(mat, 2, fun2)
> >
> >
> > Rui Barradas
> >
> > Em 24-05-2013 16:23, eliza botto escreveu:
> > > Dear Rui,
> > >
> > > I infact wanted to have something like the following..
> > > suppose the columns are
> > >
> > > structure(c(0.706461987893674, 0.998391468394261, 0.72402995269242,
> 1.70874688194537, 1.93906363083693, 0.89540353128442, 0.328327645695443,
> 0.427434603701202, 0.591932250254601, 0.444627635494183, 1.44407704434405,
> 1.79150336746345, 2.06195904001605, 1.41493262330451, 1.35748791897328,
> 1.19490680241894, 0.702488756183322, 0.338258418490199, 0.123398398622741,
> 0.138548982660226, 0.16170889185798, 0.414543218677095, 1.84629295875002,
> 2.24547399004563), .Dim = c(12L, 2L))
> > >
> > > For col 1
> > > [[1]]
> > > $Index
> > > 5 12
> > > $value
> > > 1.939 1.79
> > > Although value 1.708 of index 4 also has value which is above 80% of the maximum
> value but as it is in the neighbor of maxmimum value so we wont consider it.
> > > similarly for the column 2
> > > [[1]]
> > > $Index
> > > 12
> > > $value
> > > 2.245
> > > Although values 1.846 of index 11 and 2.0619 of index 1 also have values which are
> above 80% of the maximum value but as they are in the neighbor of maxmimum value so
> we wont consider them.
> > > i am sorry if the manner in which i asked my question was not conclusive.
> > > i hope you wont mind...
> > > Elisa
> > >> Date: Fri, 24 May 2013 15:59:50 +0100
> > >> From: ruipbarradas at sapo.pt
> > >> To: eliza_botto at hotmail.com
> > >> CC: bhh at xs4all.nl; r-help at r-project.org
> > >> Subject: Re: [R] Continuous columns of matrix
> > >>
> > >> Hello,
> > >>
> > >> Something like this?
> > >>
> > >>
> > >> fun2 <- function(x){
> > >> 	n <- length(x)
> > >> 	imx <- which.max(x)
> > >> 	if(imx == 1){
> > >> 		x[2] <- x[n] <- Inf
> > >> 	}else if(imx == n){
> > >> 		x[1] <- x[n - 1] <- Inf
> > >> 	}else{
> > >> 		x[imx - 1] <- Inf
> > >> 		x[imx + 1] <- Inf
> > >> 	}
> > >> 	index <- which(x <= 0.8*x[imx])
> > >> 	values <- x[index]
> > >> 	list(index = index, values = values)
> > >> }
> > >>
> > >> apply(mat, 2, fun2)
> > >>
> > >>
> > >> Rui Barradas
> > >>
> > >> Em 24-05-2013 13:40, eliza botto escreveu:
> > >>> Dear Rui,Thankyou very much for your help. just for my own knowledge what if
> want the values and index, which are less than or equal to 80% of the maximum value
> other than those in the neighbors?? like if maximum is in row number 5 of any column
> then the second maximum can be in any row other than 4 and 6. similarly if maximum is
> in row number 12 than the second maximum can be in any row other than 1 and
> 11...thankyou very much for your help
> > >>> elisa
> > >>>
> > >>>> Date: Fri, 24 May 2013 12:37:37 +0100
> > >>>> From: ruipbarradas at sapo.pt
> > >>>> To: eliza_botto at hotmail.com
> > >>>> CC: bhh at xs4all.nl; r-help at r-project.org
> > >>>> Subject: Re: [R] Continuous columns of matrix
> > >>>>
> > >>>> Hello,
> > >>>>
> > >>>> Berend is right, it's at least confusing. To get just the index of the
> > >>>> maximum value in each column,
> > >>>>
> > >>>> apply(mat, 2, which.max)
> > >>>>
> > >>>>
> > >>>> To get that index and the two neighbours (before and after, wraping
> > >>>> around) if they are greater than or equal to 80% of the maximum, try
> > >>>>
> > >>>> fun <- function(x){
> > >>>> 	n <- length(x)
> > >>>> 	imx <- which.max(x)
> > >>>> 	sec <- numeric(2)
> > >>>> 	if(imx == 1){
> > >>>> 		if(x[n] >= 0.8*x[imx]) sec[1] <- n
> > >>>> 		if(x[2] >= 0.8*x[imx]) sec[2] <- 2
> > >>>> 	}else if(imx == n){
> > >>>> 		if(x[n - 1] >= 0.8*x[imx]) sec[1] <- n - 1
> > >>>> 		if(x[1] >= 0.8*x[imx]) sec[2] <- 1
> > >>>> 	}else{
> > >>>> 		if(x[imx - 1] >= 0.8*x[imx]) sec[1] <- imx - 1
> > >>>> 		if(x[imx + 1] >= 0.8*x[imx]) sec[2] <- imx + 1
> > >>>> 	}
> > >>>> 	sec <- sec[sec != 0]
> > >>>> 	c(imx, sec)
> > >>>> }
> > >>>>
> > >>>> apply(mat, 2, fun)
> > >>>>
> > >>>>
> > >>>> Note that the result comes with the maximum first and the others follow.
> > >>>>
> > >>>> Hope this helps,
> > >>>>
> > >>>> Rui Barradas
> > >>>>
> > >>>>
> > >>>> Em 24-05-2013 11:41, eliza botto escreveu:
> > >>>>> There you go!!!
> > >>>>>
> > >>>>> structure(c(0.706461987893674, 0.998391468394261, 0.72402995269242,
> 1.70874688194537, 1.93906363083693, 0.89540353128442, 0.328327645695443,
> 0.427434603701202, 0.591932250254601, 0.444627635494183, 1.44407704434405,
> 1.79150336746345, 0.94525563730664, 1.1025988539757, 0.944726401770203,
> 0.941068515436361, 1.50874009152312, 0.590015480056925, 0.311905493999476,
> 0.596771673581893, 1.01502499067153, 0.803273181849135, 1.6704085033648,
> 1.57021117646422, 0.492096635764151, 0.433332688044914, 0.521585941816778,
> 1.66472272302545, 2.61878329527404, 2.19154489521664, 0.493876245329722,
> 0.4915787202584, 0.889477365620806, 0.609135860199222, 0.739201878930367,
> 0.854663750519518, 0.948228727226247, 1.38569091844218, 0.910510759802679,
> 1.25991218521949, 0.993123416952421, 0.553640392997634, 0.357487763503204,
> 0.368328033777003, 0.344255688489322, 0.423679560916755, 1.32093576037521,
> 3.13420679229785, 2.06195904001605, 1.41493262330451, 1.35748791897328,
> 1.19490680241894, 0.702488!
>  75618332!
> > >>>>>     2, 0.338258418490199, 0.123398398622741, 0.138548982660226,
> 0.16170889185798, 0.414543218677095, 1.84629295875002, 2.24547399004563,
> 0.0849732189580101, 0.070591276171845, 0.0926010253161898, 0.362209761457517,
> 1.45769283057202, 3.16165004659667, 2.74903557756267, 1.94633472878995,
> 1.19319875840883, 0.533232612926756, 0.225531074123974, 0.122949089115578),
> .Dim = c(12L, 6L))
> > >>>>>
> > >>>>> Thanks once again..
> > >>>>> Elisa
> > >>>>>
> > >>>>>
> > >>>>>> Subject: Re: [R] Continuous columns of matrix
> > >>>>>> From: bhh at xs4all.nl
> > >>>>>> Date: Fri, 24 May 2013 12:36:47 +0200
> > >>>>>> CC: r-help at r-project.org
> > >>>>>> To: eliza_botto at hotmail.com
> > >>>>>>
> > >>>>>>
> > >>>>>> On 24-05-2013, at 12:24, eliza botto <eliza_botto at hotmail.com> wrote:
> > >>>>>>
> > >>>>>>> Dear useRs,If i have a matrix, say, 12 rows and 6 columns. The columns are
> continuous. I  want to find the index of maximum values and the actual maximum values.
> The maximum values in each column are the highest values and the values greater than
> or equal to 80% of the maximum value. Moreover, if a column has more than one
> maximum values than these values should come immediately next to each other.  For
> example, if you column 1 has a highest value in 6th row then the second maximum values
> cant be in row 5 or 7. And as the columns are continuous therefore, if maximum value is
> in row 12th, then the second maximum cant be in row 11 and 1.Thankyou very much
> indeed in advance
> > >>>>>>
> > >>>>>>
> > >>>>>> Incomprehensible.
> > >>>>>> What is a continuous column?
> > >>>>>>
> > >>>>>> Please give an example input matrix and and the result you want.
> > >>>>>>
> > >>>>>> Berend
> > >>>>>>
> > >>>>>>> Elisa
> > >>>>>>> 	[[alternative HTML version deleted]]
> > >>>>>>>
> > >>>>>>
> > >>>>>> Please post in plain text.
> > >>>>>>
> > >>>>>
> > >>>>> 	[[alternative HTML version deleted]]
> > >>>>>
> > >>>>> ______________________________________________
> > >>>>> R-help at 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.
> > >>>>>
> > >>>
> > >>>
> > >
> > >
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help at 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.



More information about the R-help mailing list