如何消除一次性增值

时间:2015-06-26 16:52:43

标签: r dplyr outliers

我正在处理一个变量的时间序列数据,该变量通常会随着时间的推移而缓慢增加。非常简单的例子:

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,这不会起作用,但在完整的数据集中这是不可能的,除非有一个简单的解决方案,我不会去担心它。但是更好的方法是什么呢?

2 个答案:

答案 0 :(得分:3)

你可以尝试:

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

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

编辑:感谢@Frank进行一些修改

答案 1 :(得分:2)

你不需要重新排列。您制作的第一个差异列包含您需要的所有信息:

df %>% 
  mutate(diffprev = diff(value) %>% c(0, .)) %>%
  filter(diffprev == 0 | diffprev != -lead(diffprev) ) %>%
  select(-diffprev)

给出了

  variable value
1        1  0.25
2        2  0.25
3        3  0.25
4        5  0.25
5        6  0.50
6        7  0.50
7        8  0.50