[R] How to make the "apply" faster

Debasish Pai Mazumder pai1981 at gmail.com
Sun Jul 10 20:58:20 CEST 2016


Hi Everyone,
Thanks for your help. It works. I have similar problem when I am
calculating number of spell.
I am also calculation spell (definition: period of two or more days where x
exceeds 70) using similar way:

*new = apply(x,c(1,2,4),FUN=function(y) {fun.spell.deb(y, 70)})*

where fun.spell.deb.R:















*## Calculate spell durationfun.spell.deb <- function(data, threshold = 1,
direction = c("above", "below")){  #coln <- grep(weather, names(data))#
var <- data[,8]  if(missing(direction)) {direction <- "above"}
if(direction=="below") {b <- (data <= threshold)} else  {b <- (data >=
threshold)}    b[b==TRUE] = 1  y <-rle(b)  ans
<-length(subset((y$lengths[y$values==1]), (y$lengths[y$values==1])>=2))
return(ans)}*

Do you have any idea how to make the "apply" faster here?

-Deb


On Sat, Jul 9, 2016 at 3:46 PM, Charles C. Berry <ccberry at ucsd.edu> wrote:

> On Sat, 9 Jul 2016, Debasish Pai Mazumder wrote:
>
> I have 4-dimension array x(lat,lon,time,var)
>>
>> I am using "apply" to calculate over time
>> new = apply(x,c(1,2,4),FUN=function(y) {length(which(y>=70))})
>>
>> This is very slow. Is there anyway make it faster?
>>
>
> If dim(x)[3] << prod(dim(x)[-3]),
>
> new <-  Reduce("+",lapply(1:dim(x)[3],function(z) x[,,z,]>=70))
>
> will be faster.
>
> However, if you can follow Peter Langfelder's suggestion to use rowSums,
> that would be best. Even using rowSums(aperm(x,c(1,2,4,3)>=70,dims=3) and
> paying the price of aperm() might be better.
>
> Chuck
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list