去除时间序列中不会持续特定时间范围的噪声

remove noise that doesn't last for a specific time range in a time series

我有一个事件频率的时间序列,如下所示:

df <- data.frame("time" = c(1:20), 
    "frq" = c(0, 1, 2, 4, 0, 1, 2, 2, 4, 3, 1, 0, 3, 2, 1, 2, 4, 2, 0, 1 ))

(假设 time 是 1 到 20 秒只是为了更容易解释事情)

我正在尝试编写一个函数来滤除信号中的噪声。 如果频率在特定时间不大于背景值,我认为频率为 "noise"。

例如,假设我只想将大于 1 的频率保持 3 秒以上。 df[3:4,2] 是 "noise" 因为它们只比 1 大 2 秒,而 df[7:10,2] 不是 "noise" 因为它们比 1 大并且持续 4 秒。最后我想保留所有不是噪声的值,并将所有噪声值更改为 0。所以我试图想出一个过滤器 return:

return_df <- data.frame("time" = c(1:20), 
   "frq" = c(0, 0, 0, 0, 0, 0, 2, 2, 4, 3, 0, 0, 0, 0, 0, 2, 4, 2, 0, 0)`

谁能给我一些建议?

在基础 R 中,我们可以使用 rle

df$frq[!with(rle(df$frq > 1), rep(values & lengths >= 3, lengths))] <- 0
df

#   time frq
#1     1   0
#2     2   0
#3     3   0
#4     4   0
#5     5   0
#6     6   0
#7     7   2
#8     8   2
#9     9   4
#10   10   3
#11   11   0
#12   12   0
#13   13   0
#14   14   0
#15   15   0
#16   16   2
#17   17   4
#18   18   2
#19   19   0
#20   20   0