gpt4 book ai didi

删除由一定数量的 NA 包围的值

转载 作者:行者123 更新时间:2023-12-04 12:00:43 27 4
gpt4 key购买 nike

我希望删除被 NA 块包围的时间序列中的值一定的最小长度。

一些玩具数据:

x = seq(0,10,length.out = 100)
y = sin(x) + rnorm(length(x), mean=0, sd=0.1)
y[20:21] = rep(NA, 2)
y[50:54] = rep(NA, 5)
y[55:59] = seq(-0.1, -0.8, length.out = 5)
y[60:64] = rep(NA, 5)
y[90:91] = rep(NA, 2)

df <- data.frame(x, y)

我希望删除长度小于 10 且前后为 5 或更多 NA 的任何 y 值序列值。

在我的玩具数据中,索引 55-59 处的 y 值具有 (a) 少于 10 个连续值,并且具有 (b) 5 NA在双方。因此,应删除此值块。

其他值由较长的值块组成和/或被 NA 的短运行包围。 (< 5) 并且应该保留。

用红色绘制要删除的值:
library(ggplot2)
ggplot(data = df, aes(x, y)) +
geom_line() +
geom_line(data = df[55:59, ], color = "red")

enter image description here

最佳答案

首先,我们将定义您指定的两个阈值。 (我将第二个设置为 4,以便我们可以一致地使用“<”和“>”,而不是容易出错的“<”和“>=”)。

threshold.data <- 10
threshold.NA <- 4

现在,关键是在 is.na(y) 上使用运行长度编码。 .看 ?rle .
foo <- rle(is.na(y))
foo

首先,我们通过检查原始数据的位置 NA 来提取可能的“候选 NA”。 (因此 foo$values 将是 TRUE )并且我们指定的最小运行长度为 NA s:
candidate.runs.NA <- which(foo$values & foo$lengths>threshold.NA)

如果我们至少有两个 NA,我们只想继续运行超过阈值:
if ( diff(range(candidate.runs.NA)) >= 2 ) {

我们的目标是找到非 NA 的索引。我们要删除的数据。为此,我们找到了“(非 NA)数据的候选运行”。在第一步中,这包括第一次和最后一次之间的所有运行 NA运行上面标识:
    candidate.runs.data <- seq(candidate.runs.NA[1]+1,tail(candidate.runs.NA,1)-1)

我们通过两个标准来完善它。一方面,我们只想要非 NA 的序列s,另一方面,这些序列的长度应该低于阈值:
    candidate.runs.data <- candidate.runs.data[!foo$values[candidate.runs.data] &
foo$lengths[candidate.runs.data]<threshold.data]

在您的示例中, candidate.runs.data现在将只有一个条目 5。这意味着我们需要在 is.na 的第 5 次运行中删除所有数据。序列。为此,我们需要恢复实际索引:
    indices.to.remove <- as.vector(sapply(candidate.runs.data,function(kk)
seq(sum(foo$lengths[1:(kk-1)])+1,sum(foo$lengths[1:kk]))))

这有点复杂,因为我将它包裹在 sapply() 中打电话,以防我们收到多个 candidate.runs.data去除。最后,我们删除这些数据:
    y[indices.to.remove] <- NA
}
plot(x,y,"l")

enter image description here

现在,这似乎可以为您的特定示例做您想要的。您可能想考虑在边界情况下您希望发生什么。例如,这假设您的系列以非 NA 开头。 .如果您没有两次运行五次或更多次,会发生什么 NA s,但是三个,还是五个?有无短 NA在“长期”运行之间运行?此脚本将考虑最多九个非 NA 的任何运行。 s 在第一次和最后一次“长期”运行之间作为公平游戏。

关于删除由一定数量的 NA 包围的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29844847/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com