【问题标题】:chop a vector into chunks such that the sum of each chunk is close to a given value将向量切成块,使每个块的总和接近给定值
【发布时间】:2020-08-25 06:59:30
【问题描述】:

假设我们有一个向量x like

x <- c(9L, 4L, 7L, 1L, 2L, 13L, 7L, 11L, 14L, 2L, 11L, 3L, 1L, 5L, 
5L, 10L, 6L, 14L, 10L, 7L)

我想将x 分成几个块,这样每个块中的值的总和应该尽可能接近给定值,例如 20。最后一个块存储“残差”,因此它的总和应该也可以小于 20,但不必接近 20。

有没有什么包可以做这种分区?否则,也欢迎使用基本 R 方法!

【问题讨论】:

标签: r


【解决方案1】:

也许您可以尝试以下基本 R 选项,在 while 循环中使用 cumsum

g <- 20
out <- c()
while (length(x) > 0) {
  inds <- seq(max(which(cumsum(x) <= g)))
  out[[length(out) + 1]] <- x[inds]
  x <- x[-inds]
}

这样

> out
[[1]]
[1] 9 4 7

[[2]]
[1]  1  2 13

[[3]]
[1]  7 11

[[4]]
[1] 14  2

[[5]]
[1] 11  3  1  5

[[6]]
[1]  5 10

[[7]]
[1]  6 14

[[8]]
[1] 10  7

【讨论】:

    【解决方案2】:

    基础 R 解决方案:

    n <- 20
    split(x, ceiling(cumsum(x) / n) * n)
    

    【讨论】:

      猜你喜欢
      • 2018-03-07
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-28
      • 2014-09-03
      相关资源
      最近更新 更多