删除R中每个像素的时间序列栅格中的异常值

Posted

技术标签:

【中文标题】删除R中每个像素的时间序列栅格中的异常值【英文标题】:Removing outliers in time series rasters per pixel in R 【发布时间】:2021-11-27 02:56:22 【问题描述】:

基本上,我在堆栈中有一个时间序列的栅格。这是我的工作流程:

将堆栈转换为数据帧,这样每一行代表一个像素,每一列代表一个数据。这个过程相当简单,所以这里没有问题。

对于每一行(像素),识别异常值并将它们设置为 NA。所以在这种情况下,我想设置异常值是什么。例如,假设我想将所有大于第 75 个百分位的值设置为 NA。目标是当我计算平均值时,异常值不会影响计算。在这种情况下,异常值要高几个数量级,因此它们会显着影响平均值。

我在网上得到了一些帮助并想出了这个代码:

my_data %>%
  rowwise() %>%
  mutate(across(is.numeric, ~ if (. > as.numeric(quantile(across(), .75, na.rm=TRUE))) NA else .))

问题在于,由于它是一个栅格,因此在某些行中有很多 NA 值,我需要分位数函数在计算评估单元格时忽略这些值(见下文)

使用na.rm=TRUE 似乎是解决方案,但现在我遇到了一个新错误

错误:mutate() 输入 ..1 有问题。我..1 = across(...)。 X 需要 TRUE/FALSE 的缺失值 i 错误发生在第 1 行。

我知道要解决这个问题,如果它是 NA,我需要告诉 if 函数忽略该值,但是 dplyr 语法对我来说非常复杂,所以我需要一些关于如何做到这一点的帮助。

期待学习更多,如果有更好的方法来做我想做的事。我认为我没有很好地解释它,但希望代码有所帮助。

【问题讨论】:

你能与dput()分享数据框吗?它使每个人的事情变得更容易。更多详情:***.com/questions/5963269/… 【参考方案1】:

在提出 R 问题时,您应该始终包含一些示例数据。使用代码创建数据(见下文)或使用 R 附带的文件(如果可以避免,请使用dput)。请参阅 R 随附的帮助文件或本网站上的其他问题以获取示例和灵感。

示例数据:

library(terra)
r <- rast(ncols=10, nrows=10, nlyr=10)
set.seed(1)
v <- runif(size(r))
v[sample(size(r), 100)] <- NA
values(r) <- v

解决方案:

首先编写一个函数来做你想做的事情,并与向量一起工作

f <- function(x) 
    q <- quantile(x, .75, na.rm=TRUE)
    x[x>q] <- NA
    x

现在将其应用于栅格数据

x <- app(r, f)

使用raster 包会像这样

library(raster)
rr <- brick(r)
xx <- calc(rr, f)

请注意,您不应该创建 data.frame,但如果您这样做了,您可以执行dd &lt;- t(apply(d, 1, f)) 之类的操作

【讨论】:

以上是关于删除R中每个像素的时间序列栅格中的异常值的主要内容,如果未能解决你的问题,请参考以下文章

arcgis没有像素值

从坐标参考系中的多边形边界获取栅格中的像素坐标

如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等

R栅格:以像元值为条件的范围

使用 R 的 netcdf 栅格堆栈或栅格砖的时间和地理子集

r根据预定义的时间步长进行栅格累积和计算