我有以下示例矢量:
v = c(3, 23, 224, 124, 49)
代表相应列表中的元素数。
我要根据以下条件创建至少50个元素的组:
如果一个小组已经超过50人,我宁愿不要碰它。
我只能对相邻元素进行分组。
因此,在这种情况下,我首先将3和23相加,但我仍未达到50。所以我将26加到224(尽管我不愿意根据规则1进行计算)。因此,在第一次迭代之后,我得到了c(250, 124, 49)
。但是我仍然有49。所以我还是按照第一个规则将49分组为124-我没有其他选择,最终输出是:
v_f = c(250, 173)
如何在R中自动有效地做到这一点?
答案 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}},并在j
为k
时加总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