将栅格数据转换为data.frame

问题描述

我有多个栅格,其想法是为数据框内的每一层创建一列,但我想在循环中使用mydf$layernamemydf[[layername]]操作。在我的示例中:

library(raster)

创建一个空的数据框:

mydf<-NULL

3层模拟:

## Create a simulated RBG rasters
r <- raster(nc=30,nr=30)
r <- setValues(r,round(runif(ncell(r))* 255))
g <- raster(nc=30,nr=30)
g <- setValues(r,round(runif(ncell(r))* 255))
b <- raster(nc=30,nr=30)
b <- setValues(r,round(runif(ncell(r))* 255))
rgb<-stack(r,g,b)

使用每个图层信息填充数据帧(mydf),并使用"names"作为变量名

for (i in 1:length(rgb@layers)){
mydf$assign(paste0(rgb[[i]]@layers)) <- as(as.im(rgb[[i]]),"SpatialGridDataFrame")$v
}
Error in mydf$assign(paste0(rgb[[i]]@data@names)) <- as(as.im(rgb[[i]]),:


for (i in 1:length(rgb@layers)){
     mydf[[assign(paste0(rgb[[i]]@layers))]] <- as(as.im(rgb[[i]]),"SpatialGridDataFrame")$v
}
Error in paste0(rgb[[i]]@layers) : 

mydf$assign(paste0(rgb[[i]]@layers))mydf[[assign(paste0(rgb[[i]]@layers))]]操作有什么解决方案?

解决方法

这是非常错误的方式。您不应该使用@。例如,使用rgb@layers代替nlayers(rgb)。另外,您切勿使用assign

示例数据

library(raster)
rgb <- brick(nc=10,nr=10,nl=3)
set.seed(1)
rgb <- setValues(rgb,round(runif(3 * ncell(r)) * 255))
names(rgb) <- c("R","G","B")

您根本不需要该循环。你可以做

v <- as.data.frame(rgb)
head(v)
    R   G   B
1  68 167  68
2  95  90  56
3 146  69 132
4 232 253  69
5  51 162  46
6 229  54 132

v <- data.frame(values(rgb))

可以带有循环。最简单的方法是使用列表

x <- list()
for (i in 1:nlayers(rgb)){
     x[[i]] <- values(rgb[[i]])
}

df <- data.frame(x)
colnames(df) <- names(rgb)