我有一个包含三列的空间数据框,纬度、经度和 X。X 有一组从 1 到 25 的值,我想将其与其直接周围的网格进行比较。
lat、lon 列以小数形式填充坐标,如:
24 24 ,
24 24.1 ,
24 24.2 ,
第三列是X的值。
我想将 24,24 处的 X 与 23.9,24.1 和 23.9,24 以及 23.9,23.9 等处的 X 的值进行比较(所有 8 个网格都围绕一个网格)
对于 X 值较大的所有网格,希望开始构建从 1 到 8 的索引。(因此,如果 x 大于相邻网格 1,如果大于另一个相邻网格 2,等等)较小我想跳到下一个网格,直到所有 8 个网格都与中心网格进行检查。
我想循环它来检查包含约 300,000 个网格的景观。
我无法弄清楚 R 中的代码,如果你们中的任何人尝试过类似的事情,或者愿意尝试一下,我将非常感谢您的帮助!
我写了一个嵌入 if 条件的 for 循环:
lat <- seq(38, 39.5, by = 0.1)
lon <- seq(30, 40, by = 0.1)
#create empty df
Per_yr_beta <- data.frame(matrix(ncol = 4, nrow = 22779))
#provide column names
colnames(Per_yr_beta) <- c('Lon', 'Lat', 'Total', 'Beta')
for (i in lat) {
for (j in lon) {
ymax1 = (i+0.1)
ymin1 = (i-0.1)
xmax1 = (j+0.1)
xmin1 = (j-0.1)
sq_grid <- Per_yr_dummy %>%
filter (Lat <= ymax1 & Lat >= ymin1) %>% filter (Lon <= xmax1 & Lon >= xmin1);
x=0;
if(sq_grid$Total[5] > sq_grid$Total[1]){x=x+1}
if(sq_grid$Total[5] > sq_grid$Total[2]){x=x+1}
if(sq_grid$Total[5] > sq_grid$Total[3]){x=x+1}
if(sq_grid$Total[5] > sq_grid$Total[4]){x=x+1}
if(sq_grid$Total[5] > sq_grid$Total[6]){x=x+1}
if(sq_grid$Total[5] > sq_grid$Total[7]){x=x+1}
if(sq_grid$Total[5] > sq_grid$Total[8]){x=x+1}
if(sq_grid$Total[5] > sq_grid$Total[9]){x=x+1}
sq_grid$Beta[5] <- x
sq_grid_v <- as.data.frame(sq_grid[5, 1:4])
z=1;
Per_yr_beta[z,] <- sq_grid_v
z=z+1
}}
我被困住了。循环运行第一行,但随后什么也没有......
如果我理解正确,您希望每个新单元格携带具有较低值的相邻单元格的计数,如下所示:
您可以通过将数据帧转换为栅格并应用移动窗口来实现此目的。
让我们采用一个易于复制的 4 x 4 网格(16 个单元格),指定为数据框
d
:
d <- data.frame(expand.grid(lon = 1:4, lat = 1:4),
X = as.integer(1:16)
)
## > head(d)
## lon lat X
## 1 1 1 1
## 2 2 1 2
## 3 3 1 3
## 4 4 1 4
## 5 1 2 5
## ... 11 more rows
使其成为空间栅格:
library(terra)
r <- rast(d)
plot(r)
text(r, labels = values(r))
使用边长为
w = 3
(3 x 3 个单元)的移动窗口,其中包含中心单元及其相邻单元(邻居):
w_vals = focalValues(r, w = 3,
fill = Inf ## (1)
)
(1) 使用
Inf
inite vor 网格外的虚拟邻居,因此它们不会对具有较低值的单元格计数做出贡献
...这会产生一个 16 x 9 矩阵,其中每一行对应于初始栅格的一个像元,包含 9 个值(中心像元和邻居),即第 5 列中的焦点中央像元:
## > w_vals
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
## [1,] Inf Inf Inf Inf 13 14 Inf 9 10
## [2,] Inf Inf Inf 13 14 15 9 10 11
## [3,] Inf Inf Inf 14 15 16 10 11 12
现在,按行计算小于焦点单元格(第 5 列)的值的总和。这些是重新计算所得栅格的值:
new_vals <- apply(w_vals, 1, \(the_row) sum(the_row[5] > the_row[-5]))
创建新栅格并检查:
r_new <- setValues(r, new_vals)
plot(r_new)
text(r_new, labels = values(r_new))