我想做一个字段的累计和,但每当遇到0时重置聚合值。
下面是我想要的一个例子:
data.frame(campaign = letters[1:4] ,
date=c("jan","feb","march","april"),
b = c(1,0,1,1) ,
whatiwant = c(1,0,1,2)
)
campaign date b whatiwant
1 a jan 1 1
2 b feb 0 0
3 c march 1 1
4 d april 1 2
5条答案
按热度按时间hts6caw31#
另一个基地
这将根据
0
外观将列b
划分为组,并计算每个组的b
的累积和另一种解决方案使用最新的
data.table
版本(v 1.9.6+)根据评论的一些基准
9rnv2umw2#
另一个迟来的想法:
并进行比较:
7d7tgy0s3#
您可以将
Reduce
函数与一个自定义函数一起使用,该函数在遇到的新值为0时返回0,否则将新值添加到累积值中:mwyxok5s4#
hutilscpp::cumsum_reset
就是为此目的而设计的。第一个参数是一个逻辑向量,指示累积和何时应该继续。第二个参数是累积和本身的输入在我的机器上,与上面的
data.table
函数相比,使用cumsum_reset
的速度大约快3倍。qrjkbowd5#
另一个变体使用
rep
的值在地方重置。这只使用cumsum
一次,但缺点将导致大的数字,并可能导致整数溢出或不准确的数值,并将传播NA
到所有以下组。另一种方法是使用
Rcpp
-在本例中为 integer。一个也处理NA的变体可能看起来像:
数据
基准-基于@大卫Arenburg
结果