r-重复六边形多边形的过程,该过程为一大组多边形定义光栅边界



我很抱歉。这是我第一次使用Stackoverflow,所以我不习惯发布问题。以下是我对的编码

library(raster)
library(landscapemetrics)
library(landscapetools)
# Add raster data for 2000
hex1_2000<-raster('2000_hex1.tif')
hex2_2000<-raster('2000_hex2.tif')
hex3_2000<-raster('2000_hex3.tif')
hex4_2000<-raster('2000_hex4.tif')
...
hex23_2000<-('2000_hex4.tif')
# Add raster data for 2010
hex1_2010<-raster('2010_hex1.tif')
hex2_2010<-raster('2010_hex2.tif')
hex3_2010<-raster('2010_hex3.tif')
hex4_2010<-raster('2010_hex4.tif')
...
hex23_2010<-('2000_hex4.tif')
#Create data frame as table
hex1 = data.frame(
lc00 = values(hex1_2000),
lc10 = values(hex1_2010))
hex2 = data.frame(
lc00 = values(hex2_2000),
lc10 = values(hex2_2010))
hex3 = data.frame(
lc00 = values(hex3_2000),
lc10 = values(hex3_2010))
hex4 = data.frame(
lc00 = values(hex4_2000),
lc10 = values(hex4_2010))
...
hex23 = data.frame(
lc00 = values(hex23_2000),
lc10 = values(hex23_2010))
...
hex1 = table(hex1[,c('lc00','lc10')])
hex2 = table(hex2[,c('lc00','lc10')])
hex3 = table(hex3[,c('lc00','lc10')])
hex4 = table(hex4[,c('lc00','lc10')])
...
hex23 = table(hex23[,c('lc00','lc10')])
#Define crosstabulation matrix
Hex1_Trans = as.matrix(hex1 / rowSums(hex1))
write.csv(Hex1_Trans, 'hex1Trans.csv')
Hex2_Trans = as.matrix(hex2 / rowSums(hex2))
write.csv(Hex2_Trans, 'hex2Trans.csv')
Hex3_Trans = as.matrix(hex3 / rowSums(hex3))
write.csv(Hex3_Trans, 'hex3Trans.csv')
Hex4_Trans = as.matrix(hex2 / rowSums(hex4))
write.csv(Hex4_Trans, 'hex2Trans.csv')
...
Hex23_Trans = as.matrix(hex23 / rowSums(hex23))
write.csv(Hex23_Trans, 'hex23Trans.csv')

正如你所看到的,有无数的例子表明我在重复同样的过程。我很高兴知道如何使此代码更简单、更优雅。我的编码总是这样,我发现这显然是非常低效的。感谢大家的帮助。

以下是一个不完整的草稿,说明如何使用Map同时迭代2000和2010数据。

fn_y2000 <- c("2000_hex1.tif", "2000_hex2.tif", "2000_hex3.tif")
fn_y2010 <- c("2010_hex1.tif", "2010_hex2.tif", "2010_hex3.tif")
lst <- Map(
function(x1, x2) {
hex1 <- raster(x1)
hex2 <- raster(x2)
tbl <- table(values(hex1), values(hex2))
#... Normalise and write output 
},
fn_y2000, fn_y2010)

返回对象是一个list

也许下面的内容可以满足问题的要求
重复使用lapply读取数据文件,table读取所需列。

hexnames <- list.files(pattern = "2000_hex\d+\.tif")
hex_list <- lapply(hexnames, raster)
names(hex_list) <- paste0("hex", seq_along(hex_list), "_2000")
hex_table <- lapply(hex_list, function(X) table(X[, c('lc00','lc10')]))

非常简单的解决方案,请尝试assign((。此代码来自Data Camp的文档页面。

for(i in 1:6) { 
#-- Create objects 'r.1', 'r.2', ... 'r.6' -- 
nam <- paste("r", i, sep = ".") 
assign(nam, 1:i) 
} 
ls(pattern = "^r..$") 

这是页面的链接。查看"示例"部分。rdocumenton.org/packages/base/versions/3.6.1/topics/assign

最新更新