Dear help, suppose I have this array and want to compute sd aross rows and
columns.
p <- array(c(1:5, rep(NA, times = 3)), dim = c(5, 5, 3))
apply(p, 1:2, sd) fails because sd requires at least 2 numbers to compute sd
apply(p, 1:2, sd, na.rm = TRUE) fails for the same reason
I crafted my own function that does what I want
sd_fun <- function(i){
if(sum(!is.na(i))==0){
temp.sd <- NA
}else{
temp.sd <- sd(i, na.rm = TRUE)
}
return(temp.sd)
}
apply(p, 1:2, sd_fun)
This does what I want, but when I scale up to large arrays like
pp <- array(c(1:5, rep(NA, times = 3)), dim = c(1000, 1000, 60))
the apply function takes a long time to run.
Is there a faster, more efficient way to do this?
Thanks in advance
Matt
--
Matthew J. Oliver
Assistant Professor
College of Marine and Earth Studies
University of Delaware
700 Pilottown Rd.
Lewes, DE, 19958
302-645-4079
http://www.ocean.udel.edu/people/profile.aspx?moliver
[[alternative HTML version deleted]]
Jorge Ivan Velez
2009-Feb-25 16:42 UTC
[R] Computing sd across an array with missing values
Dear Matt,
Here are two ways:
# Data
p <- array(c(1:5, rep(NA, times = 3)), dim = c(5, 5, 3))
# First
res<-apply(p,3,function(X)
c(scols=apply(X,2,sd,na.rm=TRUE),srows=apply(X,2,sd,na.rm=TRUE))
)
res
# Second
res2<-apply(p,3,function(X)
list(scols=apply(X,2,sd,na.rm=TRUE),srows=apply(X,1,sd,na.rm=TRUE))
)
lapply(res2,function(x) do.call(rbind,x))
HTH,
Jorge
On Wed, Feb 25, 2009 at 10:53 AM, Matt Oliver <moliver@udel.edu> wrote:
> Dear help, suppose I have this array and want to compute sd aross rows and
> columns.
>
> p <- array(c(1:5, rep(NA, times = 3)), dim = c(5, 5, 3))
>
> apply(p, 1:2, sd) fails because sd requires at least 2 numbers to compute
> sd
>
> apply(p, 1:2, sd, na.rm = TRUE) fails for the same reason
>
> I crafted my own function that does what I want
>
> sd_fun <- function(i){
> if(sum(!is.na(i))==0){
> temp.sd <- NA
> }else{
> temp.sd <- sd(i, na.rm = TRUE)
> }
> return(temp.sd)
> }
>
>
> apply(p, 1:2, sd_fun)
>
> This does what I want, but when I scale up to large arrays like
>
> pp <- array(c(1:5, rep(NA, times = 3)), dim = c(1000, 1000, 60))
>
> the apply function takes a long time to run.
>
> Is there a faster, more efficient way to do this?
>
> Thanks in advance
>
> Matt
>
>
> --
> Matthew J. Oliver
> Assistant Professor
> College of Marine and Earth Studies
> University of Delaware
> 700 Pilottown Rd.
> Lewes, DE, 19958
> 302-645-4079
> http://www.ocean.udel.edu/people/profile.aspx?moliver
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-help@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.
>
[[alternative HTML version deleted]]