聚集元素以创建最小尺寸的组

时间:2018-12-13 14:13:32

标签: r vector

我有以下示例矢量:

v = c(3, 23, 224, 124, 49)

代表相应列表中的元素数。

我要根据以下条件创建至少50个元素的组:

  1. 如果一个小组已经超过50人,我宁愿不要碰它。

  2. 我只能对相邻元素进行分组。

因此,在这种情况下,我首先将3和23相加,但我仍未达到50。所以我将26加到224(尽管我不愿意根据规则1进行计算)。因此,在第一次迭代之后,我得到了c(250, 124, 49)。但是我仍然有49。所以我还是按照第一个规则将49分组为124-我没有其他选择,最终输出是:

v_f = c(250, 173)

如何在R中自动有效地做到这一点?

2 个答案:

答案 0 :(得分:2)

这可能有效:

我们从j开始累积累积和0,从k开始分组值1和组向量w设置为NA,长度= length(v)

j <- 0
k <- 1
w <- rep(NA, length(v))

现在,我们遍历i = 1:length(v),将组向量k中的分组值w设置在位置i,将v[i]的当前值添加到{ {1}},并在jk时加总j,将>= 50重置为j。如果最后一组未满50个,请将分组向量0中最后一组的所有值重置为值w

k-1

示例:

for(i in 1:length(v)){
  w[i] <- k
  j <- j + v[i]
  if(i == length(v) & j < 50){
    w[w == k] <- k-1
  }
  if(j >= 50){
    k <- k + 1
    j <- 0
  }
}

现在,我们可以v = c(3, 23, 224, 124, 49, 17, 3, 8, 12) > w [1] 1 1 1 2 3 3 3 3 3 df <- cbind.data.frame(v, w) v w 1 3 1 2 23 1 3 224 1 4 124 2 5 49 3 6 17 3 7 3 3 8 8 3 9 12 3 遍历整个组以获取累计金额:

aggregate

答案 1 :(得分:1)

我无法提出漂亮的R函数..所以这是一个for循环

v = c(3, 23, 224, 124, 49)

#initilise
result <- c()
loopcounter = 0; sum = 0; cumsum_threshold = 50

#loop through v
for (i in v) {
  #calculate the cumulative sum
  sum = i + sum
  #if cumsum > 50
  if (sum >= cumsum_threshold ) {
    #pass to result-vector
    result[ length( result ) + 1 ] <- sum
    #reset cumsum to 0
    sum <- 0
  }
  #increase loopcounter
  loopcounter = loopcounter + 1
  #when at the end of v, AND sum < threshold
  if ( loopcounter == length( v ) & sum < cumsum_threshold ) {
    #add sum to last entry of result-vector
    result[ length( result ) ] <- result[ length( result) ] + sum
  }
}

result
#[1] 250 173