我正在寻找一种创建一些掩码的解决方案,可以根据某些条件来删除一些数据(例如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阶的经典移动平均线,该移动平均线将“非零”简单地向左扩展为一个,向右扩展为一个。就这么简单。您只需要弄清楚如何处理向量的第一个点和最后一个点,然后将其转换为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 - R:按照具有重叠公差的条件移除间隔,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35571790/