我有一个很大的 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
尝试使用较少的层并更改“大小”的设置或
“exp”没有效果。
R 版本:[64 位] C:\Program Files\R\R-3.1.1
有任何想法吗?
提前致谢!
最佳答案
这似乎是一个错误(如 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)
,因为它不会有任何零。当栅格可以在内存中处理时,该函数会遍历 ojit_code 的行号,因此后续的列表索引是合理的。
我已联系维护者报告此错误。
同时,作为临时修复,您可以使用类似以下内容来制作函数的更正副本(它将在当前 R session 中保持可用)。
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)
关于从大型光栅层随机采样,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27483130/