値ラスターがあります:
m <- matrix(c(2,4,5,5,2,8,7,3,1,6,
         5,7,5,7,1,6,7,2,6,3,
         4,7,3,4,5,3,7,9,3,8,
         9,3,6,8,3,4,7,3,7,8,
         3,3,7,7,5,3,2,8,9,8,
         7,6,2,6,5,2,2,7,7,7,
         4,7,2,5,7,7,7,3,3,5,
         7,6,7,5,9,6,5,2,3,2,
         4,9,2,5,5,8,3,3,1,2,
         5,2,6,5,1,5,3,7,7,2),nrow=10, ncol=10, byrow = T)
r <- raster(m)
extent(r) <- matrix(c(0, 0, 10, 10), nrow=2)
plot(r)
text(r)
このラスターから、この図に従って現在のセルの8つの隣接するセルに値を割り当てる(または値を変更する)にはどうすればよいですか?このコード行から現在のセル内に赤い点を配置しました。
points(xFromCol(r, col=5), yFromRow(r, row=5),col="red",pch=16)ここで、期待される結果は次のようになります。
現在のセルの値(つまり、値ラスタの5)は0に置き換えられます。
全体として、8つの隣接セルの新しい値は次のように計算する必要があります。
新しい値=赤い長方形に含まれるセル値の平均*現在のセル(赤い点)と隣接するセル間の距離(つまり、斜めに隣接するセルの場合はsqrt(2)、そうでない場合は1)
更新
隣接セルの境界がラスターの制限を超えている場合、条件を尊重する隣接セルの新しい値を計算する必要があります。条件を尊重しない隣接セルは「NA」に等しくなります。
たとえば、[row、col]表記を使用して参照位置がc(5,5)ではなくc(1,1)である場合、右下隅の新しい値のみを計算できます。したがって、期待される結果は次のようになります。
     [,1] [,2] [,3]       
[1,] NA   NA   NA         
[2,] NA   0    NA         
[3,] NA   NA   New_value
たとえば、参照位置がc(3,1)の場合、右上隅、右隅、および右下隅の新しい値のみを計算できます。したがって、期待される結果は次のようになります。
     [,1] [,2] [,3]       
[1,] NA   NA   New_value         
[2,] NA   0    New_value         
[3,] NA   NA   New_value
関数を使用してこれを初めて試みましfocalたが、自動コードを作成するのは少し困難です。
隣接するセルを選択
mat_perc <- matrix(c(1,1,1,1,1,
                     1,1,1,1,1,
                     1,1,0,1,1,
                     1,1,1,1,1,
                     1,1,1,1,1), nrow=5, ncol=5, byrow = T)
cell_perc <- adjacent(r, cellFromRowCol(r, 5, 5), directions=mat_perc, pairs=FALSE, sorted=TRUE, include=TRUE)
r_perc <- rasterFromCells(r, cell_perc)
r_perc <- setValues(r_perc,extract(r, cell_perc))
plot(r_perc)
text(r_perc)
隣接するセルが現在のセルの左上隅にある場合
focal_m <- matrix(c(1,1,NA,1,1,NA,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接セルが現在のセルの中央上部にある場合
focal_m <- matrix(c(1,1,1,1,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの左上隅にある場合
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,NA,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの左隅にある場合
focal_m <- matrix(c(1,1,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの右隅にある場合
focal_m <- matrix(c(NA,1,1,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの左下隅にある場合
focal_m <- matrix(c(NA,NA,NA,1,1,NA,1,1,NA), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの中央下隅にある場合
focal_m <- matrix(c(NA,NA,NA,1,1,1,1,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
隣接するセルが現在のセルの右下隅にある場合
focal_m <- matrix(c(NA,NA,NA,NA,1,1,NA,1,1), nrow=3, ncol=3, byrow = T)
focal_function <- function(x) mean(x,na.rm=T)*sqrt(2)
test <- as.matrix(focal(r_perc, focal_m, focal_function))
mat <- matrix(c(1,1,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0), nrow=5, ncol=5, byrow = T) f.rast <- function(x) mean(x)*sqrt(2) aggr <- as.matrix(focal(r, mat, f.rast))。すべてのラスタではなく、現在のセルの8つの隣接セルのみの結果を取得するにはどうすればよいですか?ここで、結果は次のようになりますres <- matrix(c(7.42,0,0,0,0,0,0,0,0), nrow=3, ncol=3, byrow = T)。どうもありがとう !
                



rasterパッケージとfocal()関数を確認してください(p。90