将栅格数据转换为 data.frame
Transform raster data to 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))]]
操作有什么解决方案吗?
你的做法大错特错。你不应该使用 @
。例如,使用 nlayers(rgb)
而不是 rgb@layers
。另外,你应该永远不要使用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)
我有多个栅格,我的想法是为数据框中的每一层创建一个列,但我想在循环中使用 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))]]
操作有什么解决方案吗?
你的做法大错特错。你不应该使用 @
。例如,使用 nlayers(rgb)
而不是 rgb@layers
。另外,你应该永远不要使用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)