如何消除一次性增值

如何消除一次性增值

我正在使用时间序列数据,该数据通常会随着时间缓慢增加。非常简化的示例:

df <- data.frame(index=1:8, value = c(rep(0.25, 3),1.95,0.25,rep(0.5,3)))

 index value
     1  0.25
     2  0.25
     3  0.25
     4  1.95
     5  0.25
     6  0.50
     7  0.50
     8  0.50


数据集的重复特征是在索引4处发生的情况:该值先上升然后立即又下降。我想删除这些值。 (我的数据集中也有一些点,值稍有增加,然后在一段时间后稍有减少,但我想保留这些点。)

我发现了一种删除值的方法,方法是使用diff计算上一个值的变化,然后将数据框上下颠倒,再次使用diff计算下一个值的变化,并删除其中两个差异相同,但这似乎是有史以来效率最低的过程:

library(dplyr)

df %>%
  mutate(diffprev = diff(value) %>% c(0, .)) %>%
  arrange(desc(variable)) %>%
  mutate(diffnext = diff(value) %>% c(0, .)) %>%
  filter(diffprev == 0 | diffprev != diffnext)


我意识到,如果值的峰值发生在索引5而不是索引4上,那么它将无法正常工作,但是在整个数据集中,这样的可能性很小,因此除非有简单的解决方法,否则我就不用担心。但是解决这个问题的更好方法是什么?

最佳答案

您可以尝试:

df %>% filter(lag(value) != lead(value) | (value - lag(value)) %in% c(0, NA))


您可能也对lag中的leaddplyr函数感兴趣。

编辑:感谢@Frank的一些修改

关于r - 如何消除一次性增值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31078357/

10-12 17:18