您可以使用 MESS 包中的 cumsumbinning 内置函数:
# install.packages("MESS")
MESS::cumsumbinning(x, 25, cutwhenpassed = F)
# [1] 1 1 2 2 3 3 3
或者可以使用purrr::accumulate:
cumsum(x == accumulate(x, ~ifelse(.x + .y <= 25, .x + .y, .y)))
# [1] 1 1 2 2 3 3 3
输出
group <- MESS::cumsumbinning(x, 25, cutwhenpassed = F)
data.frame(x= c(1, 23, 7, 10, 9, 2, 4),
group = group)
x group
1 1 1
2 23 1
3 7 2
4 10 2
5 9 3
6 2 3
7 4 3
快速基准测试:
x<- c(1, 23, 7, 10, 9, 2, 4)
bm <- microbenchmark(
fThomas(x),
fThomasRec(x),
fJKupzig(x),
fCumsumbinning(x),
fAccumulate(x),
fReduce(x),
fRcpp(x),
times = 100L,
setup = gc(FALSE)
)
autoplot(bm)
Егор Шишунов 的 Rcpp 最快,紧随其后的是 MESS::cumsumbinning 和 ThomasIsCoding 的两个函数。
使用n = 100,差距变大,但Rcpp 和cumsumbinning 仍然是首选,while 循环选项不再有效(我不得不删除 ThomasIsCoding 的函数,因为执行时间太长):
x = runif(100, 1, 50)