[英]Highest value since - finding the interval in R
我现在在 Forex 项目工作,但在途中发现了一个问题。 我试图找出上次当前值如此高或如此低的时间是什么时候。
一开始我试图这样做:
length(c(1:10)) - max(which(c(1:10) <= 6))
即如果我们考虑向量c(1:10,6)
上面函数的输出将是 4。这意味着 6 是自 4 个间隔以来的最高值。
所以我现在的目标是将上述函数实现到dplyr::mutate
方法中。 这就是事情失控的地方......使用runner
包中的runner
函数,我能够创建带有值及其滞后的 tibble:
# A tibble: 11 x 2
value `runner(value, lag = 1)`
<dbl> <list>
1 9 <dbl [0]>
2 7 <dbl [1]>
3 4 <dbl [2]>
4 1 <dbl [3]>
5 5 <dbl [4]>
6 2 <dbl [5]>
7 5 <dbl [6]>
8 4 <dbl [7]>
9 1 <dbl [8]>
10 6 <dbl [9]>
11 6 <dbl [10]>
但是无论我尝试过什么,我都无法将当前列表中的值编号与跑步者列相关联。 我正在尝试诸如purrr:map
或sapply
但仍然会引用整个列。 我也试图实现dplyr::rowWise
但它也没有帮助我。
我觉得我正在解决解决方案,并且显然可以轻松完成。 如果有一些神奇的包可以帮助我快速解决我的问题,我将非常感谢您的帮助。 但我仍然想知道在这种情况下是否有一种方法可以将当前行值而不是整列与当前行值相关联。
我还试图将其关闭为一个整洁的用户制作功能,因此如果您能指出我的方向,那将是另一个优点。
也许您正在寻找这样的东西?
last_below <- function(x)
{
sapply(seq(x), function(i) {
y <- i - rev(which(x[i] >= cummax(x)))[1]
if(y < 0) 0 else y
})
}
所以你可以做
library(dplyr)
df <- data.frame(x = c(1:10, 6, 4, 5, 2))
df %>% mutate(y = last_below(x))
#> x y
#> 1 1 0
#> 2 2 0
#> 3 3 0
#> 4 4 0
#> 5 5 0
#> 6 6 0
#> 7 7 0
#> 8 8 0
#> 9 9 0
#> 10 10 0
#> 11 6 5
#> 12 4 8
#> 13 5 8
#> 14 2 12
由reprex 包(v0.3.0) 于 2020 年 8 月 24 日创建
它绝对可以用runner
来完成。 请注意, runner
中的function(x)
会针对每个累积进行评估 - 尝试runner(vec)
以查看结果(列表)。 想象一下,这个列表的每个元素都是一步,每一步都执行function(x)
。
想象一下,对于一个步骤(例如第 10 步),您需要找到当前符合条件之前的观察次数。
library(runner)
set.seed(1)
# dummy data
x <- round(cumsum(rnorm(10)))
current_idx <- 10
current_x <- x[current_idx]
up_to_current <- x[-current_idx]
current_idx - which(up_to_current == current_x)
# [1] 2 5
上面的代码可以是function(x)
主体 - “多远”在当前之前匹配条件
runner(
vec,
function(x) {
# current index
current_idx <- length(x)
# current value
current_x <- x[current_idx]
# values up to current
up_to_current <- x[-current_idx]
# how many observations since last condition matching
current_idx - which(up_to_current == current_x)
}
)
上面返回一个列表,因为function(x)
输出长度不同。 如果它返回单个值 - 它将返回一个向量。
PS 要在当前观察后找到匹配条件的索引,您需要包含rev(vec)
并使用索引差异。
享受!
感谢@allan-cameron 的回答,我找到了解决方案:
last_below <- function(x) {
sapply(
seq(x),
function(i) {
(i - tail(which(x[0:(i-1)] <= x[i]),1))[1]
}
)
}
通过调用:
a %>%
mutate(b = last_below(value))
我得到输出:
# A tibble: 11 x 2
value b
<dbl> <int>
1 9 NA
2 7 NA
3 4 NA
4 1 NA
5 5 1
6 2 2
7 5 1
8 4 2
9 1 5
10 6 1
11 6 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.