[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