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

丹尼尔·叶菲莫夫(Daniel Yefimov)

例如,我有以下代码:

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
大卫·阿伦堡(David Arenburg)

正如我在评论中提到的那样,即使对于像我这样的人,用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,这对整数和浮点数均有效,并且不处理NAs。阈值的默认值设置为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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在 bigquery 中的某个阈值处启动 SUM 聚合

来自分类Dev

从Python中的某个阈值绘制

来自分类Dev

如何计算R中某个阈值以下的2个坐标之间的距离?

来自分类Dev

对R中的多个向量使用tapply和cumsum函数

来自分类Dev

映射函数中多个阈值的 R T.test

来自分类Dev

R:差异小于某个阈值时的平均顺序值

来自分类Dev

R:差值低于某个阈值时的平均顺序值

来自分类Dev

计算列表中子列表中某个阈值以上的元素数

来自分类Dev

使用php替换str中某个pos处的字符

来自分类Dev

在行类中,列在某个宽度处重叠

来自分类Dev

y_pred的自定义损失函数Keras仅高于某个阈值

来自分类Dev

排除小于R中阈值的值

来自分类Dev

如何使收益数低于R中的阈值?

来自分类Dev

更改R中类别预测的阈值

来自分类Dev

根据阈值选择 R 中的行

来自分类Dev

降低 R 中规则的支持阈值

来自分类Dev

如何在r中使用markovchain仅绘制高于某个最小阈值的边缘

来自分类Dev

在zsh函数中获取光标处的单词

来自分类Dev

在zsh中的函数定义处扩展变量

来自分类Dev

使用整数输入向量优化R中的函数,该向量加到某个值

来自分类Dev

R如何检查是否从某个程序包的特定函数中调用了自定义函数

来自分类Dev

了解K&R中的破坏

来自分类Dev

获取具有线性渐变的矩形中某个偏移处的颜色

来自分类Dev

如果在某个位置的空白处,则将hypen添加到文件中

来自分类Dev

在R中的空间处拆分因子

来自分类Dev

当列高于R中的阈值时,删除重复的行

来自分类Dev

在R中的相关矩阵上应用阈值

来自分类Dev

如何通过r中的阈值对匹配组进行计数

来自分类Dev

计算R中超过阈值范围的每列的值数

Related 相关文章

热门标签

归档