A slight modification gives the equivalent results instead of using 'tail'
> m <- matrix(rexp(6e6,rate=0.05), nrow=600) # 5,000 cols
> m[m<20] <- 20
> func1 <- function(v,cut=20) max(which(v>20))
> func2 <- function(v,cut=20) {
+ x <- which(v>20) + x[length(x)] + }
user system elapsed
1.33 0.05 1.47
> # user system elapsed
> # 0.40 0.02 0.42
> system.time(apply(m, 2, func2))
user system elapsed
1.31 0.08 1.44
> # user system elapsed
> # 0.70 0.05 0.75
>
Here is another view using Rprof on the first version. You can see that 'tail' takes a fair amount of time; accounts for the differences in timing:
/cygdrive/c: perl perf/bin/readrprof.pl tempxx.txt 0 2.7 root
On Fri, Jul 11, 2008 at 12:23 PM, Thaden, John J <ThadenJohnJ_at_uams.edu> wrote:
> I had written asking for a simple way to extract the
> Index of the last value in a vector greater than some
> cutoff, e.g., the index, 6, for a cutoff of 20 and this
> example vector:
>
> v <- c(20, 134, 45, 20, 24, 500, 20, 20, 20)
>
> Thank you, Alain Guillet, for this simple solution sent
> to me offlist:
>
> max(which(v > 20)
>
> Also, thank you Lisa Readdy for a lengthier solution.
>
> Other offerings yielded the value instead of the index
> (the phrasing of my question apparently was misleading):
>
> v[max(which(v > 20))] (Henrique Dallazuanna)
>
> tail(v[v>20],1) (Jim Holtman)
>
> Jim's use of tail() suggests a variant to Alain's
> solution
>
> tail(which(v > 20), 1)
>
> This is faster than the max() version with long vectors,
> but, to my surprise, slower (on my WinXP Lenovo T61 laptop)
> in a rough mockup of my column-wise apply() usage:
>
> m <- matrix(rexp(3e6,rate=0.05), nrow=600) # 5,000 cols
> m[m<20] <- 20
> func1 <- function(v,cut=20) max(which(v>20))
> func2 <- function(v,cut=20) tail(which(v>20),1)
> system.time(apply(m, 2, func1))
> # user system elapsed
> # 0.40 0.02 0.42
> system.time(apply(m, 2, func2))
> # user system elapsed
> # 0.70 0.05 0.75
>
> Thank you again, Alain and others.
> John
>
> ----------------
>
> On Thu, Jul 10, 2008 at 9:41 AM, John Thaden wrote:
>> This shouldn't be hard, but it's just not
>> coming to me:
>> Given a vector, e.g.,
>> v <- c(20, 134, 45, 20, 24, 500, 20, 20, 20)
>> how can I get the index of the last value in
>> the vector that has a value greater than n, in
>> the example, with n > 20? I'm looking for
>> an efficient function I can use on very large
>> matrices, as the FUN argument in the apply()
>> command.
>
> Confidentiality Notice: This e-mail message, including a...{{dropped:8}}
>
> ______________________________________________
> 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.
>
-- Jim Holtman Cincinnati, OH +1 513 646 9390 What is the problem you are trying to solve? ______________________________________________ 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.Received on Sat 12 Jul 2008 - 12:02:15 GMT
Archive maintained by Robert King, hosted by
the discipline of
statistics at the
University of Newcastle,
Australia.
Archive generated by hypermail 2.2.0, at Sun 13 Jul 2008 - 10:31:27 GMT.
Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.