如何修复“(函数...)自变量中的错误暗示不同的行数

时间:2019-04-29 17:43:05

标签: r matrix satellite-image

我正在尝试总结NDVI值的卫星图像的栅格值。我已经提取了数据,似乎已经填充了一个列表,我可以在控制台窗口中看到该列表,但是我无法使用“查看”功能来查看它,也无法将其创建为.csv。

示例数据

library(raster)
r <- raster(ncol=36, nrow=18, vals=1:(18*36))
ndvi <- stack(r, r*2, r*3)
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(100,60), c(120,0), c(120,-55), c(80,0))
polys <- spPolygons(cds1, cds2)

提取值

v <- extract(ndvi, polys)

写入文件

write.csv(v, "test.csv")
#Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : arguments imply differing number of rows: 38, 23

str(v)
#List of 2
# $ : num [1:38, 1:3] 326 327 328 329 330 331 332 333 334 335 ...
#  ..- attr(*, "dimnames")=List of 2
#  .. ..$ : NULL
#  .. ..$ : chr [1:3] "layer.1" "layer.2" "layer.3"
# $ : num [1:23, 1:3] 173 208 209 244 245 280 281 282 315 316 ...
#  ..- attr(*, "dimnames")=List of 2
#  .. ..$ : NULL
#  .. ..$ : chr [1:3] "layer.1" "layer.2" "layer.3"

我希望能够使用NDVI图像的像元值分布在某个时候将其与另一组数据进行关联,因此,为了做到这一点,我需要具有所有单元格的值。预先谢谢你。

2 个答案:

答案 0 :(得分:0)

我们不知道对象类型vals_03_01是什么,因为您没有提供有关shp对象的信息。根据栅格和sp的输入,输出可能会完全不同。如果空间矢量对象包含多边形,那么vals_03_01将是一个列表。如果shp是点,则提取将返回向量(对于单个栅格)或矩阵(对于堆栈/砖,其中列表示堆栈中的每个栅格)。

请使用vals_03_01classdim查看str对象的类,尺寸和结构。这将告诉您数据是否适合将结果直接写入平面文件,或者在导出之前需要其他处理/摘要(例如lapply)。很有可能extract返回了一个包含矩阵对象的列表。

答案 1 :(得分:0)

v是一个列表。列表中的每个元素都有一个由多边形覆盖的栅格像元值。单元格的数量因多边形而异,因此您不能将其变成矩形矩阵。

这意味着您不能使用write.csvView

您是否仍然需要一个“ csv”文件(您如何需要某种文件类型进行关联)?您可以改为使用saveRDS(v, "test.rds")

也许每个多边形都需要一个值? 在这种情况下,您可以执行以下操作:

v <- extract(ndvi, polys, mean, na.rm=TRUE)
v
#      layer.1  layer.2   layer.3
#[1,] 387.8158 775.6316 1163.4474
#[2,] 329.3913 658.7826  988.1739

write.csv(v, "test.csv")

请参见?raster::extract