从大型光栅层随机采样

时间:2014-12-15 11:35:03

标签: r raster

我有一个大的Rasterlayer,整数范围从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

尝试使用更少的层次并更改&#34;尺寸&#34;要么 &#34;&EXP#34;没有效果。 R版本:[64位] C:\ Program Files \ R \ R-3.1.1

有什么想法吗?

提前感谢!

1 个答案:

答案 0 :(得分:3)

这似乎是一个错误(如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填充r[] <- sample(44, ncell(r), replace=TRUE),则会发现错误,因为它不会有任何零。

当光栅可以在内存中处理时,该函数会循环遍历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)