我正在尝试找到解决以下问题的最有效方法。假设我们有一些看起来像这样的数据:
d1 <- seq(0, 3000, length.out = 1000)
d2 <- cos(seq(0, 6*pi, length.out = 1000))*rev(seq(0, 1, length.out = 1000))
dd <- as.data.frame(cbind(d1, d2))
我需要从d2
第一个长度为 20 的连续递增数字序列的第一个元素中检测。在上图中,它将位于 附近的某个地方d1 = 500
。我目前的方法是基于这个功能:
getFirstBeforeSequence <- function(x, y, len){
a1 <- cbind(lapply(split(y, cumsum(c(1, diff(y) < 0))), length))
a2 <- which(a1 > len)[1]-1
a3 <- sum(unlist(a1)[1:a2])+1
a3
}
这个函数给了我想要的输出,元素在位置 164 并且发生在d1 = 489.4895
:
getFirstBeforeSequence(dd$d1, dd$d2, 20)
# 164
dd$d1[164]
# 489.4895
但是,我的印象是我的解决方案过于复杂,而且我很确定其他人会有更好的解决方案。任何帮助将不胜感激。