R:通过具有重叠容差的标准删除间隔

标签 r

我正在寻找一种解决方案来创建一些掩码,使用它我可以根据某些条件删除一些数据(例如 data.frame 中的行),例如:

a <- c(0,0,0,3,5,6,3,0,0,0,4,5,8,5,0,0,0,0,0)
mask <- a == 0
mask
[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE TRUE TRUE

在我的实际问题中,这个剪辑太苛刻了,我希望有一些更平滑的过渡。想法:我想在非零之前包含一些零,并在非零之后添加一些零。简单的方法:如果我有这个向量,我想将与 FALSE 相邻的每个 TRUE 切换为 FALSE,这会向数据添加重叠的容差区域。所以而不是

a[!mask]
[1] 3 5 6 3 4 5 8 5

我宁愿有类似的东西

a[!mask]
[1] 0 3 5 6 3 0 0 4 5 8 5 0 

或者(增加容差窗口的大小)

a[!mask]
[1] 0 0 3 5 6 3 0 0 0 4 5 8 5 0 0

在最后一种情况下,中间的三个零出现,因为左侧和右侧的公差开始重叠。我的问题:有没有人有一个好的方法,如何编写一个函数来创建这样一个具有重叠容差的掩码?

[编辑]对我来说,有一段时间我意识到我最初的问题中的错误(感谢@tospig)在我最初的帖子中,我完全把中间部分的零数量弄错了!对困惑感到抱歉。因此,为了澄清:在容差窗口为 1 的情况下,中间确实应该有两个零:一个来自右侧的一组有效数据,一个来自左侧的一组有效数据。抱歉造成困惑!

因此,尽管 @tospig 的方法非常酷(我必须牢记这一点),但 @agenis 的解决方案完美地解决了我的问题!

最佳答案

我想我会采用经典的 3 阶移动平均线,它只是将“非零”向左扩展 1,向右扩展 1。就这么简单。您只需要弄清楚如何处理矢量的第一个和最后一个点,这些点将变成 NA(在我的示例中,我将它们设为零)。

您就得到了想要的结果(对于更大的掩码,您采用顺序 5 而不是 3):

a <- c(0,0,0,3,5,6,3,0,0,0,4,5,8,5,0,0,0,0,0)
library(forecast)
a.ma <- ma(a, 3)
a.ma[is.na(a.ma)] <- 0
mask <- a.ma == 0
a[!mask]
#### [1] 0 3 5 6 3 0 0 4 5 8 5 0

然后你就可以轻松地将这段代码转化为函数了。

[编辑]此方法不能确保零总数的保存(请参阅附加评论以澄清OP初始问题)

关于R:通过具有重叠容差的标准删除间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35571790/

相关文章:

r - 在 R 的 matplot 中写入 $^*$

舍入到有效数字*仅* R 中数字的小数部分

r - 如何格式化R中SPEI包的硬编码绘图函数的x轴?

r - 使用 dplyr::mutate 计算某些列的平均值

r - 设置 ggplot 标题以反射(reflect) dplyr 分组

r - 指定在 doSNOW 集群中加载哪些对象

r - 从字符串列表中创建公式

r - R Shiny 中的渐变色数据表行

r - 使用 Shiny 的 DT 动态预选行

r - 为什么 mutate 仅应用于第一行并将其结果重复到其余行