填写向量

时间:2018-01-24 09:31:20

标签: r

a <- c(0,3,7,2) 
b <- 10`  

我尝试在向量a的长度上分布一定数量的值(b)。我想填补它们,而不是将10/4添加到a的每个值。这种情况的结果向量应为c(5,5,7,5)。

我尝试了什么:

f = e + b
opt.vert <- function(b,a,f) {
  repeat{lapply(1:length(a),
               function(x) if((a[[x]] == min(a)) && (a[[x]]) < (b/length(a))){
                  a[[x]] <- a[[x]] +1
                } else {
                  a[[x]] <- a[[x]]
                } )
    if(sum(a) >= f) break
  }
  return(a)
}

除了那种非常不优雅的方法外,它也不起作用。我很难搞清楚它有什么问题,因为它似乎把我拖入一个永恒的循环中,因此我没有得到任何错误信息。

2 个答案:

答案 0 :(得分:3)

for (i in seq_len(b)) a[which.min(a)] <- a[which.min(a)] + 1
#[1] 5 5 7 5

请注意which.min返回第一个最小值的位置。如果你想以不同方式打破关系,你必须稍微修改它。

(我怀疑在任务的数学背景上花一些时间可能会导致更有效的解决方案,可以避免循环。对于有更多业余时间的人来说,这可能是一个很好的难题。)

答案 1 :(得分:1)

使用递归

这样的事情
a <- c(0, 3, 7, 2)
b <- 10
Reduce(function(x, y) {
    idx <- which.min(x)
    x[idx] <- x[idx] + 1
    x
}, rep(1, b), a, accumulate=TRUE)