使用R根据另一个栅格的特定值从栅格中提取像素

umb*_*987 3 r raster dataframe r-raster

我使用该函数导入了两个栅格(栅格AB)R 中的栅格raster。我想将AwhereB等于 1的像素提取到数据框中。我正在尝试以下操作,但是,我获得的所有像素都具有相同的值,尽管它们是在原始数据集中。

这两个栅格具有相同的维度(ncols、nrows、ncell、分辨率、范围、投影)。

library(raster)
library(rgdal)

# import inputs
A <- raster('/pat/to/rasterA.tif')
B <- raster('/pat/to/rasterB.tif')

# extract raster values from A over raster B where B == 1
mydata <- data.frame(A[B[B == 1]])
Run Code Online (Sandbox Code Playgroud)

编辑 1

可能是当我这样做时A[B[B == 1]],来自对象 A 和 B 的类RasterLayer变为numeric,这会产生问题吗?我通过这样做发现了这一点class(A[B[B == 1]]),这给出了numeric.

编辑 2

好吧,这很奇怪。我尝试这样做mydata <- data.frame(A[B]),现在输出A仅在B == 1位置处具有原始内容。在从中提取所有像素之前尝试此操作A(正如我所期望的那样)。我可以通过计算 中的 1 的数量B和 中的元素数量来确认它是正确的mydata,这是相同的。就像索引跳过了B. 谁能解释一下?

Rob*_*ans 5

请在这样的问题中包含一些示例数据:

library(raster)
r <- raster(nrow=5, ncol=5, xmn=0, xmx=1, ymn=0, ymx=1)
set.seed(1010)
A <- setValues(r, sample(0:5, ncell(r), replace=TRUE))
B <- setValues(r, sample(0:2, ncell(r), replace=TRUE))
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

s <- stack(A,B)
v <- as.data.frame(s)
v[v[,2] == 1, 1]
Run Code Online (Sandbox Code Playgroud)

或者

A[B==1]
Run Code Online (Sandbox Code Playgroud)

或者

D <- overlay(A, B, fun=function(x,y){ x[y!=0] <- NA; x})
na.omit(values(D))
Run Code Online (Sandbox Code Playgroud)

或者

xy <- rasterToPoints(B, function(x) x == 1)
extract(A, xy[,1:2])
Run Code Online (Sandbox Code Playgroud)

或者

A[B!=1] <- NA
rasterToPoints(A)[, 3]
Run Code Online (Sandbox Code Playgroud)

等等...

现在为什么会这样:A[B[B == 1]]不起作用?打开包装:

B[B == 1]
# [1] 1 1 1 1 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

Bwhere的单元格值B==1当然是1A[B[B == 1]]因此变为A[c(1,1,1,..)],并多次返回第一个单元格的值。

A[B]等价于A[B!=0]asB在这种情况下被视为逻辑语句,0 == FALSE并且所有其他值都是TRUE