首页 > 解决方案 > 将栅格数据转换为 data.frame

问题描述

我有多个栅格,想法是为数据框中的每个图层创建一列,但我想在循环中使用mydf$layername或操作。mydf[[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))]]操作?

标签: rrasterr-raster

解决方案


你这样做的方式非常错误。你不应该使用@. 例如,而不是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)

推荐阅读