这基本上是在这个问题https://gis.stackexchange.com/questions/95481/in-r-set-na-cells-in-one-raster-where-another-raster-has-values和此处为大栅格图层中的 R-Chaging 特定像元值。第一个问题的答案没有解决我的问题,因为我没有另一个可以与overlay或 一起使用的对象calc。重新分类是唯一有效的方法。
就我而言,我有一个 300 MB 的光栅文件。我正在应用一个简单的操作,只是尝试用 NA 替换栅格中等于某个数字的所有值。我有大约 4 GB 的可用 RAM,但似乎我无法完成此操作,因为我收到错误消息“无法分配大小为 4.6 GB 的向量”。我什至尝试将我的内存大小设置为 16 GB,但是我得到了同样的错误,只是说无法分配大小为 9.2 GB 的向量。我尝试了以下两个选项:
r[r==5]=NA
values(r)[values(r)==5]
Run Code Online (Sandbox Code Playgroud)
奇怪的是,即使是像 table(values(r)) 这样的简单操作也会出现同样的错误,例如 ArcMap 可以在几秒钟内创建这个表。我已经解决了我的问题,但我想知道为什么内存使用效率如此低下,以及如何防止或避免它?为什么raster需要多达 9 GB 来处理 300 MB 的文件?这是这个包的限制还是 R 的限制?
您可以通过使用栅格包函数来避免将所有值加载到内存中。例如:
library(raster)
r <- raster(ncol=10, nrow=10)
r[] <- sample(5, ncell(r), replace=TRUE)
Run Code Online (Sandbox Code Playgroud)
而不是table(values(r))使用freq:
freq(r)
Run Code Online (Sandbox Code Playgroud)
将值 5 更改为 NA。无论reclassify是与subs
x <- reclassify(r, data.frame(from=5, to=NA))
y <- subs(r, data.frame(from=5, to=NA), subsWithNA=FALSE)
freq(x)
Run Code Online (Sandbox Code Playgroud)
lbusset 建议calc,这也应该可以正常工作。