ฉันมีค่าแรสเตอร์:
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"
ตัวอย่างเช่นหากตำแหน่งอ้างอิงคือ c (1,1) แทน c (5,5) โดยใช้สัญกรณ์ [row, col] จะสามารถคำนวณเฉพาะค่าใหม่ที่มุมล่างขวา ดังนั้นผลลัพธ์ที่คาดหวังจะเป็น:
[,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()
ฟังก์ชั่นของ R (หน้า 90 เอกสารประกอบ): cran.r-project.org/web/packages/raster/raster.pdf