使用R根据另一个栅格的特定值从栅格中提取像素
Extracting pixels from a raster based on specific value of another raster using R
我使用 raster
函数在 R 中导入了两个栅格(栅格 A
和 B)
。
我想将 A
的像素提取到数据框中,其中 B
等于 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]])
编辑 1
可能是当我执行 A[B[B == 1]]
时,来自 RasterLayer
的对象 A 和 B 的 class 变成了 numeric
,这会产生问题吗?我通过 class(A[B[B == 1]])
发现了这一点,它给出了 numeric
.
编辑 2
好吧,这很奇怪。我尝试执行 mydata <- data.frame(A[B])
,现在输出仅在 B == 1
位置具有原始 A
。在从 A
中提取所有像素之前尝试此操作(如我所料)。我可以通过计算 B
中的个数和 mydata
中的元素数来确定它是正确的,这是相同的。就像索引跳过了 B
中的所有零一样。谁能解释一下?
这应该适用于 1 个值:
A[B == 1]
还有这个,对于 0 值
A[B == 0]
示例数据:
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))
现在你可以做:
s <- stack(A,B)
v <- as.data.frame(s)
v[v[,2] == 1, 1]
或者:
A[B==1]
或:
D <- overlay(A, B, fun=function(x,y){ x[y!=0] <- NA; x})
na.omit(values(D))
或:
xy <- rasterToPoints(B, function(x) x == 1)
extract(A, xy[,1:2])
或:
A[B!=1] <- NA
rasterToPoints(A)[, 3]
等...
现在为什么这样:A[B[B == 1]]
不起作用?打开包装:
B[B == 1]
# [1] 1 1 1 1 1 1 1 1 1 1
B
的单元格值 B==1
当然是 1
。 A[B[B == 1]]
因此变成 A[c(1,1,1,..)]
,并且 returns 多次成为第一个单元格的值。
A[B]
等同于 A[B!=0]
,因为在这种情况下 B
被认为是逻辑语句,而 0 == FALSE
和所有其他值都是 TRUE
我使用 raster
函数在 R 中导入了两个栅格(栅格 A
和 B)
。
我想将 A
的像素提取到数据框中,其中 B
等于 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]])
编辑 1
可能是当我执行 A[B[B == 1]]
时,来自 RasterLayer
的对象 A 和 B 的 class 变成了 numeric
,这会产生问题吗?我通过 class(A[B[B == 1]])
发现了这一点,它给出了 numeric
.
编辑 2
好吧,这很奇怪。我尝试执行 mydata <- data.frame(A[B])
,现在输出仅在 B == 1
位置具有原始 A
。在从 A
中提取所有像素之前尝试此操作(如我所料)。我可以通过计算 B
中的个数和 mydata
中的元素数来确定它是正确的,这是相同的。就像索引跳过了 B
中的所有零一样。谁能解释一下?
这应该适用于 1 个值:
A[B == 1]
还有这个,对于 0 值
A[B == 0]
示例数据:
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))
现在你可以做:
s <- stack(A,B)
v <- as.data.frame(s)
v[v[,2] == 1, 1]
或者:
A[B==1]
或:
D <- overlay(A, B, fun=function(x,y){ x[y!=0] <- NA; x})
na.omit(values(D))
或:
xy <- rasterToPoints(B, function(x) x == 1)
extract(A, xy[,1:2])
或:
A[B!=1] <- NA
rasterToPoints(A)[, 3]
等...
现在为什么这样:A[B[B == 1]]
不起作用?打开包装:
B[B == 1]
# [1] 1 1 1 1 1 1 1 1 1 1
B
的单元格值 B==1
当然是 1
。 A[B[B == 1]]
因此变成 A[c(1,1,1,..)]
,并且 returns 多次成为第一个单元格的值。
A[B]
等同于 A[B!=0]
,因为在这种情况下 B
被认为是逻辑语句,而 0 == FALSE
和所有其他值都是 TRUE