我正在使用时间序列数据,该数据通常会随着时间缓慢增加。非常简化的示例:
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
中的lead
和dplyr
函数感兴趣。编辑:感谢@Frank的一些修改
关于r - 如何消除一次性增值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31078357/