如何消除一次性增值
How to remove one-off increases in value
我正在处理一个通常随时间缓慢增加的变量的时间序列数据。非常简单的例子:
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))
您可能还对 dplyr
中的 lag
和 lead
函数感兴趣。
编辑:感谢@Frank 的一些修改
您不需要重新排列。您创建的第一个差异列包含您需要的所有信息:
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
我正在处理一个通常随时间缓慢增加的变量的时间序列数据。非常简单的例子:
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))
您可能还对 dplyr
中的 lag
和 lead
函数感兴趣。
编辑:感谢@Frank 的一些修改
您不需要重新排列。您创建的第一个差异列包含您需要的所有信息:
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