2016-04-12 7 views
0

に渡します。これは、Rには、3Dim配列とターゲット値が与えられた関数を書こうとしています。 x、y点ごとにz方向のターゲットに最も近い値。ターゲットの所定のマージン内に値がない場合、マトリックスはそのポイントでNAでなければなりません。Rは、すべてのx、y点のz方向に最も近い値のインデックスを3dimの配列

私は動作する機能を書いたが、あまりにも遅く、グリッドのデータグリッドにはdim(x) = c(586,538,100)と処理したい。私は配列x、yのインデックスを経由するループの2つを回避する方法を知りません。 apply使用

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) 

答えて

1

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 
+0

はそんなに@fanliありがとうございます。私の機能の半分の時間でうまく動作します。私は適用機能を認識していましたが、私はそれを使用することに経験がありません。私はこれを理解するために年齢が必要でした。本当にありがとう。 – Atomhamster

関連する問題