大栅格图层的随机抽样

3

我有一个包含0到44整数的大型栅格图层。

class       : RasterLayer
dimensions  : 29800, 34470, 1027206000  (nrow, ncol, ncell)
resolution  : 10, 10  (x, y)
extent      : 331300, 676000, 5681995, 5979995  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs
data source : /home/mkoehler/stk_rast_whz
names       : stk_rast_whz
values      : 0, 44  (min, max)

我希望对每个层进行分层抽样,每个层需要5000个点。

我得到了以下错误:

POINTS<-sampleStratified(b, size=5000, na.rm=T, xy=F)
(Error in ys[[i]] <- y : attempt to select less than one element)

这里有一段代码,可以复现问题(即使每个层只选择1个项目):
 set.seed(10)
 r <- raster(ncol=5000, nrow=5000)
 names(r) <- 'stratum'
 r[] <- round((runif(ncell(r)))*44)

 sampleStratified(r, size=1,xy=T)

Error in ys[[i]] <- y : attempt to select less than one element

尝试减少层数并更改“size”或“exp”的设置没有效果。 R版本:[64位] C:\Program Files\R\R-3.1.1 有什么想法吗? 提前致谢!

1
你的示例代码在我的电脑上运行正常(R 3.1.0,32位)。 - koekenbakker
奇怪!这取决于我使用的R版本/库版本吗? - Micha
可能是。请检查您的“raster”软件包版本。我正在使用2.2-31。 - koekenbakker
是的,那是个好主意。你也可以尝试使用代码的旧版本这里。也许你可以逐步运行代码并检查每一步的输出来进行调试。 - koekenbakker
@koekenbakker 我猜你的系统可以在内存中处理光栅图像,所以你没有遇到这个问题(请参见我下面的帖子)。 - jbaums
显示剩余2条评论
1个回答

3

看起来这是一个bug(至少在raster 2.3-12中),并且会发生在两种情况下:(1)你的栅格包含值为0的单元格,以及(2)无法在内存中处理这个栅格(即canProcessInMemory(r)FALSE)。

函数通过循环遍历由freq(r)产生的唯一单元格值,并逐个按这些值对列表进行索引。如果其中一个值为零,则会触发错误,因为第0个元素不存在。例如:

list()[[0]]
# Error in list()[[0]] : attempt to select less than one element]

您会发现,如果您使用例如r[] <- sample(44, ncell(r), replace=TRUE)这样的内容填充r,则不会出现错误,因为它不会有任何零值。
当栅格可以在内存中处理时,该函数会循环遍历freq(r)的行号,因此后续的列表索引是合理的。
我已经联系了维护者报告此错误。
与此同时,作为临时解决方法,您可以使用以下内容来创建一个已更正的函数副本(在当前的R会话中仍然可用)。
sampleStratified2 <- 
  eval(parse(text=sub('sr\\[, 2\\] == i', 'sr[, 2] == f[i, 1]',
                      sub('i in f\\[, 1\\]', 'i in seq_len(nrow(f))',
                          deparse(getMethod(sampleStratified, 
                                            signature='RasterLayer')@.Data))
  )))

sampleStratified2(r, size=1, xy=TRUE)

1
谢谢,这个问题已经在光栅版本2.3-20中得到修复(目前仅在R-Forge上可用,很快会在CRAN上发布)。 - Robert Hijmans
@RobertH 太棒了 - 感谢您如此迅速地解决这个问题。 - jbaums

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接