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 <ccbe...@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]] ______________________________________________ R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see 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.