删除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 <- t(apply(d, 1, f))
之类的操作
【讨论】:
以上是关于删除R中每个像素的时间序列栅格中的异常值的主要内容,如果未能解决你的问题,请参考以下文章
如何找到图像中的所有像素都是灰度或每个像素的 R、G、B 值相等