使用tidyVerse函数,我希望创建一个新的数据列,其总和为第一列中的累计和,但使用的增量不超过incr.

这可以从DF开始

incr <- 1.5
df <- data.frame(a = c(6,0,0,2.5,0,0))
df
    a
1 6.0
2 0.0
3 0.0
4 2.5
5 0.0
6 0.0

然后使用incr创建新的列b:

    a   b
1 6.0 1.5
2 0.0 1.5
3 0.0 1.5
4 2.5 1.5
5 0.0 1.5
6 0.0 1.0

我找到了tidyr::uncount(),它看起来像是一个可以工作的函数,但我需要使用非整数增量.一般情况下,我会try 变异和使用矢量化函数,并考虑运行它rowwise(),但我的大多数 idea 都需要迭代.

来自下面的 comments :如果类比是有帮助的,就把它想象成排队下载.第a列显示您在时间1按下下载6 MB,在时间2和3按0 MB,然后按在时间4下载2.5 MB.然而,您的连接只能以incr的速度下载.因此,如果incr是1.5,则列b显示实际下载的内容.您将在每个时段充分使用该连接速度,直到您在时间6下载最终剩余部分(1.0).

为了更好地突出维度,下面是另一个DF:

incr <- 1.5
df <- data.frame(a = rep(0,100),b=rep(0,100))
df$a[c(30,33,38)] = c(6,2.5,1)
df[30:39,]
     a b
30 6.0 0
31 0.0 0
32 0.0 0
33 2.5 0
34 0.0 0
35 0.0 0
36 0.0 0
37 0.0 0
38 1.0 0
39 0.0 0

具有所需的输出

     a   b
30 6.0 1.5
31 0.0 1.5
32 0.0 1.5
33 2.5 1.5
34 0.0 1.5
35 0.0 1.0
36 0.0 0.0
37 0.0 0.0
38 1.0 1.0
39 0.0 0.0

推荐答案

因为我不知道什么时候该放弃,我想唯一的解决办法就是迭代.但我认为你总是可以在C++中进行迭代,使其像矢量化函数一样超快:

Rcpp::cppFunction(
  "
    NumericVector iterate_to_cumsum(NumericVector v1, double incr) {
    int x = v1.size();
    NumericVector v2(x);

    for (int i =0; i < x; ++i) {
      v2[i] = std::max(0.0, std::min(incr, sum(v1[Rcpp::Range(0, i)]) - sum(v2)));
    }

    return v2;

  }
"
)

library(tidyverse)

df <- data.frame(a = c(6, 0, 0, 2.5, 0, 0, 0, 0, 1, 0, 3, 0, 0, 0))
incr <- 1.5

df |> 
  mutate(b = iterate_to_cumsum(a, incr))
#>      a   b
#> 1  6.0 1.5
#> 2  0.0 1.5
#> 3  0.0 1.5
#> 4  2.5 1.5
#> 5  0.0 1.5
#> 6  0.0 1.0
#> 7  0.0 0.0
#> 8  0.0 0.0
#> 9  1.0 1.0
#> 10 0.0 0.0
#> 11 3.0 1.5
#> 12 0.0 1.5
#> 13 0.0 0.0
#> 14 0.0 0.0

R相关问答推荐

提取R中值和列名的所有可能组合

使用ggplot将平滑线添加到条形图

如何在ggplot 2线性图的每个方面显示每个组的误差条?

从嵌套列表中智能提取线性模型系数

如何将dygraph调用到R Markdown作为一个shiny 的react 对象的参数?

在R中,如何在每个堆叠的条上放置误差条,特别是当使用facet_grid时?

在R中使用download. file().奇怪的URL?

在df中保留原始变量和新变量

如何在观测缺失的地方添加零

可以替代与NSE一起使用的‘any_of()’吗?

通过在colname中查找其相应值来创建列

LOF中的插图短文字幕

如何指定我的函数应该查找哪个引用表?

如何在R中使用hmm TMB提前一步预测观察到的状态?

如何根据未知数的多列排除重复行

如何预测原始数据集并将值添加到原始数据集中

SHILINY中DT列的条件着色

如何获取R chromote中的当前URL?

R dplyr::带有名称注入(LHS of:=)的函数,稍后在:=的RHS上引用

如何根据每个子框架中分类因子的唯一计数来过滤子框架列表?