Thanks Bill for the email.
Your function looks great.
f2<- function(x) x[c(diff(x)<1,TRUE)]
?f2(a4)
#[1]? 8? 4? 4? 4 13 12
?f2(a3)
#[1]? 8? 1? 1? 1 13? 4
Using the example you provided.
set.seed(24)?
?a5 <- sample(20, replace=TRUE, size=1e7)
?f1New<- function(x) x[c(diff(x)<0,TRUE)|c(x[-length(x)]==x[-1],TRUE)]
f3 <- function(x)x[c(which(diff(x)<1),length(x))] #Marion's function
(changed `==` to `<`)
f1 <- function(x)? x[sort(c(which(c(diff(x)<0,TRUE)), which(x[-length(x)]
== x[-1])))]
?identical(f1New(a5),f1(a5))
#[1] TRUE
?identical(f2(a5),f1(a5))
#[1] TRUE
?identical(f3(a5),f1(a5))
#[1] TRUE
system.time(f1New(a5))
#?? user? system elapsed
?# 1.884?? 0.212?? 2.102
?system.time(f1(a5))
#?? user? system elapsed
?# 1.604?? 0.268?? 1.874
?system.time(f2(a5))
#?? user? system elapsed
?# 1.080?? 0.120?? 1.206
system.time(f3(a5)) #Marion's function
#?? user? system elapsed
?# 0.856?? 0.140?? 0.998
A.K.
----- Original Message -----
From: William Dunlap <wdunlap at tibco.com>
To: arun <smartpink111 at yahoo.com>
Cc:
Sent: Thursday, May 30, 2013 2:28 PM
Subject: RE: [R] Fwd: Obtaing the maximum
Also, your suggestion could avoid the relatively expensive call to sort() if you
used logical subscripts.
Note that, as a subscript, if conditionA and conditionB are logical vectors with
the same length and
!any(conditionA & conditionB) then
? sort( c( which(conditionA), which(conditionB) ))
is equivalent to
? conditionA | conditionB
so your
? sort(c(which(c(diff(x)<0,TRUE)), which(x[-length(x)] == x[-1])))
is equivalent to
? c(diff(x)<0, TRUE) | c(x[-length(x)] == x[-1]), TRUE)
where I padded the second part with TRUE to match the lengths.
Now x[-length(x)]==x[-1] is the same as diff(x)==0 so you might as well use just
? c(diff(x) <= 0, TRUE)
? ?
Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com
> -----Original Message-----
> From: arun [mailto:smartpink111 at yahoo.com]
> Sent: Thursday, May 30, 2013 11:13 AM
> To: William Dunlap
> Subject: Re: [R] Fwd: Obtaing the maximum
>
> Thanks Bill.
> Arun
>
>
>
>
> ----- Original Message -----
> From: William Dunlap <wdunlap at tibco.com>
> To: arun <smartpink111 at yahoo.com>
> Cc:
> Sent: Thursday, May 30, 2013 2:07 PM
> Subject: RE: [R] Fwd:? Obtaing the maximum
>
> I thought her != should have been a <, but since the original question
was garbled it was
> hard to say.
> In any case, I was only pointing out that converting the logical subscripts
to integer
> subscripts via
> which() and length() was not necessary.
>
> By the way, solutions to problems like this are more easily compared if
presented? as
> functions
> rather than complicated expressions.? E.g., instead of
> ?? a4[sort(c(which(c(diff(a4)<0,TRUE)), which(a4[-length(a4)] ==
a4[-1])))]
> ?? a3[sort(c(which(c(diff(a3)<0,TRUE)), which(a3[-length(a3)] ==
a3[-1])))]
> I would rather see
> ?? f1 <- function(x)? x[sort(c(which(c(diff(x)<0,TRUE)),
which(x[-length(x)] == x[-1])))]
> ?? f1(a4)
> ?? f1(a3)
> Then others can quickly compare various algorithms on different datasets.?
E.g.
> ? f3 <- function(x)x[c(which(diff(x)<1),length(x))]
> ? a4<-c(c(1,4,5,8),rep(4,3),c(1,8,11,13),8:12)
> ? identical(f1(a4), f3(a4))
> ? # [1] TRUE
> ? identical(f1(a3), f3(a3))
> ? # [1] TRUE
> ? a5 <- sample(20, replace=TRUE, size=1e7)
> ? identical(f1(a5), f3(a5))
> ? # [1] TRUE
> ? system.time(f1(a5))
> ? # user? system elapsed
> ? # 1.23? ? 0.03? ? 1.31
> ? system.time(f3(a5))
> ? # user? system elapsed
> ? # 0.61? ? 0.00? ? 0.60
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>
> > -----Original Message-----
> > From: arun [mailto:smartpink111 at yahoo.com]
> > Sent: Thursday, May 30, 2013 10:52 AM
> > To: William Dunlap
> > Subject: Re: [R] Fwd: Obtaing the maximum
> >
> > It works with a1.? (Already sent a reply to Marion.)
> >
> >
> > a3[c(diff(a3) != 1, TRUE)]
> > # [1]? 1? 5? 8? 1? 1? 1? 1? 8 11 13? 4
> > ?a3[sort(c(which(c(diff(a3)<0,TRUE)), which(a3[-length(a3)] ==
a3[-1])))]
> > #[1]? 8? 1? 1? 1 13? 4
> >
> >
> > a4[sort(c(which(c(diff(a4)<0,TRUE)), which(a4[-length(a4)] ==
a4[-1])))]
> > #[1]? 8? 4? 4? 4 13 12
> > a4[c(diff(a4) != 1, TRUE)]
> > # [1]? 1? 5? 8? 4? 4? 4? 1? 8 11 13 12
> > A.K.
> >
> >
> > ----- Original Message -----
> > From: William Dunlap <wdunlap at tibco.com>
> > To: Marion Wenty <marion.wenty at kinderrechteinstitut.at>;
> > "tryingtolearnagain at gmail.com" <tryingtolearnagain at
gmail.com>;
> > "smartpink111 at yahoo.com" <smartpink111 at
yahoo.com>; "r-help at r-project.org" <r-
> > help at r-project.org>
> > Cc:
> > Sent: Thursday, May 30, 2013 1:50 PM
> > Subject: RE: [R] Fwd:? Obtaing the maximum
> >
> > > or ... a shorter way would be:
> > >
> > > a1<-c(1,2,3,4,5,1,2,3,1,1,1,2,3,4,5,1,2,3)
> > >
> > > a1[c(which(diff(a1)!=1),length(a1))]
> >
> > Or, even shorter,
> > ?? a1[c(diff(a1) != 1, TRUE)]
> >
> > 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 Marion Wenty
> > > Sent: Thursday, May 30, 2013 10:20 AM
> > > To: tryingtolearnagain at gmail.com; smartpink111 at yahoo.com;
r-help at r-project.org
> > > Subject: [R] Fwd: Obtaing the maximum
> > >
> > > Hi,
> > >
> > > or ... a shorter way would be:
> > >
> > > a1<-c(1,2,3,4,5,1,2,3,1,1,1,2,3,4,5,1,2,3)
> > >
> > > a1[c(which(diff(a1)!=1),length(a1))]
> > >
> > > Hope it helps.
> > >
> > > Marion
> > >
> > > ---------- Forwarded message ----------
> > > From: arun <smartpink111 at yahoo.com>
> > > Date: 2013/5/29
> > > Subject: Re: [R] Obtaing the maximum
> > > To: R help <r-help at r-project.org>
> > >
> > >
> > > Hi,
> > > May be this helps:
> > > a1<-c(1:5,1:3,rep(1,2),1:5,1:3)
> > >? a1
> > > # [1] 1 2 3 4 5 1 2 3 1 1 1 2 3 4 5 1 2 3
> > >
> > >
> > > a1[sort(c(which(c(diff(a1)<0,TRUE)), which(a1[-length(a1)] ==
a1[-1])))]
> > > #[1] 5 3 1 1 5 3
> > > a2<-c(1:2,rep(1,4),1:7,1:3)
> > > a2
> > > # [1] 1 2 1 1 1 1 1 2 3 4 5 6 7 1 2 3
> > >? a2[sort(c(which(c(diff(a2)<0,TRUE)), which(a2[-length(a2)] ==
a2[-1])))]
> > > #[1] 2 1 1 1 1 7 3
> > >
> > > a3<-c(c(1,4,5,8),rep(1,3),c(1,8,11,13),1:4)
> > >? a3
> > > # [1]? 1? 4? 5? 8? 1? 1? 1? 1? 8 11 13? 1? 2? 3? 4
> > >? a3[sort(c(which(c(diff(a3)<0,TRUE)), which(a3[-length(a3)] ==
a3[-1])))]
> > > #[1]? 8? 1? 1? 1 13? 4
> > >
> > >? a4<-c(c(1,4,5,8),rep(4,3),c(1,8,11,13),8:12)
> > >? a4
> > > # [1]? 1? 4? 5? 8? 4? 4? 4? 1? 8 11 13? 8? 9 10 11 12
> > > a4[sort(c(which(c(diff(a4)<0,TRUE)), which(a4[-length(a4)] ==
a4[-1])))]
> > > #[1]? 8? 4? 4? 4 13 12
> > > A.K.
> > >
> > >
> > >
> > > >Hi all, I have a series whose tpe for that is like series I
expose below.
> > > >
> > > >The thing is if a incremental number ends I?m in the first
"type" of event
> > > >in this success is named 5 (because of the maximum is 5). In
the series I
> > > >have this kind of events? 5,3,1,1,5,3
> > > >
> > > >But I don?t know extactly a priori what is the maximum and
when "stops"
> > > >there is some function in r doing something similar this?
> > > >
> > > >Thans in advance to all.
> > > >
> > > >
> > > >1
> > > >2
> > > >3
> > > >4
> > > >5
> > > >1
> > > >2
> > > >3
> > > >1
> > > >1
> > > >1
> > > >2
> > > >3
> > > >4
> > > >5
> > > >1
> > > >2
> > > >3
> > >
> > > ______________________________________________
> > > 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.
> > >
> > >
> > >
> > > --
> > > Mag.a Marion Wenty
> > > Wissenschaftliche Mitarbeiterin
> > > Institut f?r Kinderrechte und Elternbildung
> > > Ballgasse 2, 6. Stock
> > > 1010 Wien
> > >
> > > ??? [[alternative HTML version deleted]]