【发布时间】:2022-01-19 23:13:43
【问题描述】:
我正在尝试找到最有效的方法来识别值低于特定阈值的向量的最长滚动和。例如,如果我们有1:10 和6 的阈值,那么3 是我们最长的滚动和。
我有下面的代码和我为此制作的功能,但显然非常慢。想知道是否有更有效或已经实现的算法来识别总和低于阈值的最长运行。
library(dplyr)
library(zoo)
set.seed(1)
df <- data.frame(
g = rep(letters[1:10], each = 100),
x = runif(1000)
)
longest_rollsum <- function(x, threshold) {
for (i in 1:length(x)) {
rs <- rollsum(x, i, na.pad = TRUE, align = "right")
if (!any(rs <= threshold, na.rm = TRUE)) {
return(i - 1)
}
}
return(i)
}
df %>%
group_by(g) %>%
summarize(longest = longest_rollsum(x, 2))
#> # A tibble: 10 × 2
#> g longest
#> <chr> <dbl>
#> 1 a 7
#> 2 b 6
#> 3 c 9
#> 4 d 6
#> 5 e 6
#> 6 f 8
#> 7 g 6
#> 8 h 7
#> 9 i 11
#> 10 j 9
【问题讨论】:
-
您确定您的预期输出正确吗?根据您的样本数据,
g = "a"的前 3 个条目的 cumsum ≤ 2。Wy 是该字母 7 而不是 3 的longest? -
你可以在 Rcpp 中写一个短路函数来提高速度。例如,对于 1:10,您从 k=1 开始,因为第一个小于 6,您放弃其余的并检查 k=2,因为 1+2 小于 6,您跳过其余的并检查 k= 3 和 1:3 是 >=6,然后做下一个,直到所有向量都检查无误
标签: r rolling-sum