r - 将栅格数据转换为 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))]]
操作?
解决方案
你这样做的方式非常错误。你不应该使用@
. 例如,而不是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)
推荐阅读
- authentication - 在 slapd.conf 文件中加密的密码
- microsoft-graph-api - OneDrive 文件下载返回 95 字节内容
- bash - Bash 脚本比较结合 getfattr
- airflow - 如何通过 Airflow 中的 task_id 获取上游任务的任务实例?
- postgresql - 为什么我在此加入时收到此 PostgreSQL 错误...?
- javascript - 在 Google Chrome 开发工具中,对象前面的字母是什么意思?
- azure - Azure 应用程序配置:labelFilter:是否可以“首选”某个标签而不排除其他标签?
- reactjs - 转到上一页下一个js应用程序时不显示数据
- swift - 为什么 CKFetchRecordsOperation 不起作用?
- keras - 升级tensorflow2.1后,出现“RuntimeError: tf.placeholder() is not compatible with eager execution。”