简体   繁体   中英

R getting indices of closest value in z direction for all x,y points in 3dim array

I'm trying to write a function in R which is given an 3dim array and a target value and returns a matrix of the indeces with the closest value to the target in z direction for every x,y point. If there is no value within a given margin of the target the matrix should be NA at that point.

I wrote a function which works but is too slow for the hundereds of data grids with dim(x) = c(586,538,100) I want to process. I don't know how to avoid the two for loops going over the arrays x,y indices.

x <- seq(6.5,13,len=90)
dim(x) <- c(3,3,10)

get.zvals <- function(dens_grid,layer,margin=0.2){
                    out <- dens_grid[,,1]
                    out[] <- NA
                    for(i in 1:dim(out)[1]){
                       for(j in 1:dim(out)[2]){
                          x <- dens_grid[i,j,]
                          if(  sum(!is.na(x)) >2
                             & sum(x[x<(layer+margin) & x>(layer-margin)],na.rm=TRUE) >=1 ){
                              out[i,j] <- which.min(abs(x-layer))
                           }
                       }
                    }
                    return(out)
                }

y <- get.zvals(x,12.06)

Using apply :

get.zvals <- function(dens_grid, layer, margin=0.2) {
    apply(dens_grid, c(1,2), function(x) ifelse(any(abs(x-layer) < margin), 
      which.min(abs(x-layer)), NA))
}
> get.zvals(x,12.06)
     [,1] [,2] [,3]
[1,]   NA    9    9
[2,]   NA    9   NA
[3,]    9    9   NA

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM