连续超过阈值和R中的附加条件
我想用R得到满足以下条件的时间序列中的时间步长(应该是满足以下条件的第一个时间步长): 这是数据连续超过阈值和R中的附加条件,r,time-series,multiple-conditions,R,Time Series,Multiple Conditions,我想用R得到满足以下条件的时间序列中的时间步长(应该是满足以下条件的第一个时间步长): 这是数据 structure(list(V1 = c(-3.85326, -2.88262, -4.1405, -3.95193, -6.68925, -2.04202, -2.47597, -4.91161, -2.5946, -2.82873, 2.68839, -4.1287, -4.50296, -0.143476, -1.12174, -0.756168, -1.67556, -1.92704
structure(list(V1 = c(-3.85326, -2.88262, -4.1405, -3.95193,
-6.68925, -2.04202, -2.47597, -4.91161, -2.5946, -2.82873, 2.68839,
-4.1287, -4.50296, -0.143476, -1.12174, -0.756168, -1.67556,
-1.92704, -1.89279, -2.37569, -5.71746, -2.7247, -4.12986, -2.29769,
-1.52835, -2.63623, -2.31461, 2.32796, 4.14354, 4.47055, -0.557311,
-0.425266, -2.37455, -5.97684, -5.22391, 0.374004, -0.986549,
2.36419, 0.218283, 2.66014, -3.44225, 3.46593, 1.3309, 0.679601,
5.42195, 10.6555, 8.34144, 1.64939, -1.64558, -0.754001, -4.77503,
-6.66197, -4.07188, -1.72996, -1.15338, -8.05588, -6.58208, 1.32375,
-3.69241, -5.23582, -4.33509, -7.43028, -3.57103, -10.4991, -8.68752,
-8.98304, -8.96825, -7.99087, -8.25109, -6.48483, -6.09004, -7.05249,
-4.78267)), class = "data.frame", row.names = c(NA, -73L))
到目前为止我拥有的
我能够结合条件1和条件2。这是剧本
first_exceed_seq <- function(x, thresh = 0, len = 3)
{
# Logical vector, does x exceed the threshold
exceed_thresh <- x > thresh
# Indices of transition points; where exceed_thresh[i - 1] !=
exceed_thresh[i]
transition <- which(diff(c(0, exceed_thresh)) != 0)
# Reference index, grouping observations after each transition
index <- vector("numeric", length(x))
index[transition] <- 1
index <- cumsum(index)
# Break x into groups following the transitions
exceed_list <- split(exceed_thresh, index)
# Get the number of values exceeded in each index period
num_exceed <- vapply(exceed_list, sum, numeric(1))
# Get the starting index of the first sequence where more then len
exceed thresh
transition[as.numeric(names(which(num_exceed >= len))[1])]
}
这个数字是28。这应该是正确的答案,但我想知道下面的问题
问题
1) 我想在上述函数中添加第三个条件,使29到32的和大于1。
通过上面的函数,我将最小长度设置为3。我将把它应用于多个时间序列,我可能会遇到一个具有四个或更多连续正值的时间序列,并且该时间序列的第一个时间步不满足[3],而是第二个或第三个时间步等
有没有关于如何做的建议?我将感谢任何帮助
更新:我尝试了下面的解决方案,但dplyr给出了警告消息
1:在筛选器_impl(.data,quo)中:
针对潜在客户
强制进行混合评估。请使用dplyr::lead()或
库(dplyr)以删除此警告
正确答案应该是28,因为它首先满足所有三个条件。这里是一个使用
dplyr
包和lead
功能的解决方案。在以下代码中,x
是您提供的数据:
library(dplyr)
newx <- x %>% as_tibble() %>%
mutate(time = 1: n()) %>%
filter(V1 > 0, lead(V1, 1) > 0, lead(V1, 2) > 0,
lead(V1, 1) + lead(V1, 2) + lead(V1, 3) + lead(V1, 4) > 1)
# A tibble: 7 x 2
V1 idx
<dbl> <int>
1 2.33 28
2 2.36 38
3 3.47 42
4 1.33 43
5 0.680 44
6 5.42 45
7 10.7 46
关于错误:要么像我那样包含
dplyr
包,要么用filter::lead
替换lead
,谢谢。。这条线:lead(V1,1)+lead(V1,2)+lead(V1,3)+lead(V1,4)>1)应该是lead(V1,2)+lead(V1,3)+lead(V1,4)+lead(V1,5)>1之后的下一个时间步吗?这也给了我一个错误:>1:在filter_impl(.data,quo)中:对lead强制进行混合评估。请使用dplyr::lead()或库(dplyr)删除此警告。我编辑了我的问题。正确答案应该是28。这应该是满足上述条件的时间步长的第一次出现。嗨,Cettt,你知道如何解决警告吗?我仍然收到来自dplyr的警告。事实上,它没有给出结果,只是警告而已。我把它放在我回答的最后。为什么28是解决方案?在31时,V1=-0.557。因此,违反了条件2:28之后的三个连续时间步(即29、30、31)不大于0。哦..对..我更正了条件2。很抱歉犯了这个错误,.应该包括[1]中的时间步长,所以它是28,29,30。
first_exceed_seq(dat[,1])
library(dplyr)
newx <- x %>% as_tibble() %>%
mutate(time = 1: n()) %>%
filter(V1 > 0, lead(V1, 1) > 0, lead(V1, 2) > 0,
lead(V1, 1) + lead(V1, 2) + lead(V1, 3) + lead(V1, 4) > 1)
# A tibble: 7 x 2
V1 idx
<dbl> <int>
1 2.33 28
2 2.36 38
3 3.47 42
4 1.33 43
5 0.680 44
6 5.42 45
7 10.7 46
slice(newx, 1)
# A tibble: 1 x 2
V1 idx
<dbl> <int>
1 2.33 28