如何循环处理栅格以将其转换为data.frames

时间:2019-04-05 20:02:38

标签: r loops dataframe r-raster

我有一些要转换为数据帧的栅格。我可以一个接一个地手动操作,但是效率低下。当我尝试进行循环(使用带有名称的列表或向量)时,代码不起作用,R错误提示“ as.data.frame.default(x [[i]],optional = TRUE)中的错误:不能强制类'structure(“ RasterLayer”,package =“ raster”)'到data.frame“

我尝试使用功能Assign()使其实现,但是它也不起作用。使用名称向量时,我只能得到R来制作一个包含向量名称

的单次观察的数据帧

当我一个接一个地做时,R实际上成就了我想要的。我的一个栅格代码只是

 #"a" is the name of the raster
r_1 <- as.data.frame(a, xy=TRUE, na.rm=TRUE, centroids=TRUE)

我尝试了几种方法来使循环正常运行,但都失败了。首先,我尝试通过创建向量并使用函数Assign()循环

# "a" and "b" are the names of my rasters
o2 <- c("a","b") 

for(i in 1:length(o2)){
  nam <- substr(o2[i],1,nchar(o2))
  assign(nam,as.data.frame(o2[i], xy=TRUE, na.rm=TRUE, centroids=TRUE))
} 

但这只会创建一个名为a1的数据框,其中包含一个观察值“ a1”和一个变量。 我也尝试过列出一个清单

o4 <- list(a,b)
for(i in 1:length(o4)){
 nam <- substr(o4[i],1,nchar(ola4))
r_i <- as.data.frame(o4[i], xy=TRUE, na.rm=TRUE, centroids=TRUE)
}

这一次的错误是:“ as.data.frame.default(x [[i]],可选= TRUE)中的错误:无法将类'structure(“ RasterLayer”,package =“ raster”)'强制为一个data.frame”

我希望有一个三列和行的数据框与栅格中的像元一样多。列应该是每个单元格的质心的纬度和经度,以及应该包含每个单元格的信息的列。我的代码中没有看到任何错误,也许有人可以帮助我。

我使用不同的shapefile自己创建了栅格。我有40多个具有以下特征的栅格:witdth 8806,高度:10389,原点:-77.6699,4.94778,像素大小:0,001041666,SRC:EPSG:4326-WGS 84-地理。正如我所说,我自己创建了栅格,并且所有栅格都具有相同的特征。

2 个答案:

答案 0 :(得分:0)

您可以使用apply来代替循环:

s=c(raster1,raster2,raster3)
lapply(s, as.data.frame)

答案 1 :(得分:0)

在问这样的问题时,请始终包括一些示例数据(通常不是您的数据)。这是使用三个(相同的)栅格文件

matrix(3*3)[a b c;d e f;g h 1]*[0 0 1]=[188 155 1] etc 

And I get the transformation matrix as 
[0.311 -0.003 188;0.044 0.605 155;0 0 1]

tm=[0.311 -0.003 188;0.044 0.605 155;0 0 1]
tff = projective2d(tm)
I=imread('a1.jpg');
output=imwarp(I,tff);
imshow(output);

现在使用列表来完成所需的操作。

f <- system.file("external/test.grd", package="raster")
ff <- c(f,f,f)

请勿使用r <- lapply(ff, raster) x <- lapply(r, function(i) as.data.frame(i, xy=TRUE, na.rm=TRUE))