使用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