gpt4 book ai didi

r - 在r中的某个阈值处破坏 cumsum() 函数

转载 作者:行者123 更新时间:2023-12-01 02:36:30 25 4
gpt4 key购买 nike

例如我有以下代码:

cumsum(1:100)

如果元素 i+1 大于 3000,我想打破它。我怎样才能做到这一点?

所以不是这个结果:

[1]    1    3    6   10   15   21   28   36   45   55   66   78   91  105  120  136  153  171  190  210  231  253  276  300
[25] 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990 1035 1081 1128 1176
[49] 1225 1275 1326 1378 1431 1485 1540 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415 2485 2556 2628
[73] 2701 2775 2850 2926 3003 3081 3160 3240 3321 3403 3486 3570 3655 3741 3828 3916 4005 4095 4186 4278 4371 4465 4560 4656
[97] 4753 4851 4950 5050

我想要得到以下结果:

 [1]    1    3    6   10   15   21   28   36   45   55   66   78   91  105  120  136  153  171  190  210  231  253  276  300
[25] 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990 1035 1081 1128 1176
[49] 1225 1275 1326 1378 1431 1485 1540 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415 2485 2556 2628
[73] 2701 2775 2850 2926

最佳答案

正如我在评论中提到的,即使对于像我这样的人来说,在 Rcpp 中编写简单的东西也不应该是什么大问题。这是一个非常原始的实现,似乎可以工作(感谢@MatthewLundberg 的改进建议)

library(Rcpp)
cppFunction('NumericVector cumsumCPP(NumericVector x, int y = 0){

// y = 0 is the default
// Need to do this in order to avoid modifying the original x
int n = x.size();
NumericVector res(n);
res[0] = x[0];

for (int i = 1 ; i < n ; i++) {
res[i] = res[i - 1] + x[i];
if (res[i] > y && (y != 0)) {
// This breaks the loop if condition met
return res[seq(0, i - 1)];
}
}

// This handles cases when y== 0 OR y != 0 and y > cumsum(res)
return res;
}')

cumsumCPP(1:100, 3000)
# [1] 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300
# [25] 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990 1035 1081 1128 1176
# [49] 1225 1275 1326 1378 1431 1485 1540 1596 1653 1711 1770 1830 1891 1953 2016 2080 2145 2211 2278 2346 2415 2485 2556 2628
# [73] 2701 2775 2850 2926

与基本 Rs cumsum 类似,这适用于整数和 float ,但不处理 NA。 treshhold 的默认值设置为 0 - 如果您想限制负的 cumsum,这并不理想,但我现在想不出任何更好的值(您可以自行决定)。

虽然它可以使用一些优化...

set.seed(123)
x <- as.numeric(sample(1:1e3, 1e7, replace = TRUE))
microbenchmark::microbenchmark(cumsum(x), cumsumCPP(x))
# Unit: milliseconds
# expr min lq mean median uq max neval cld
# cumsum(x) 58.61942 61.46836 72.50915 76.7568 80.97435 99.01264 100 a
# cumsumCPP(x) 98.44499 100.09979 110.45626 112.1552 119.22958 131.97619 100 b

identical(cumsum(x), cumsumCPP(x))
## [1] TRUE

关于r - 在r中的某个阈值处破坏 cumsum() 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42328945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com