我需要输出(对于另一个动物园:roll_apply)要求总和达到某个值的元素数.下面是一个例子:
  # value to reach
  vTR = c(10,15,12,13,10,15,10)
  # element to sum
  element = c(9,6,5,2,1,9,1)
  magicFoo(vTR, element) 
  # should return c(NA, 2, 3, 3, 4, 4, 2) 
  # 10 ~ NA, 15 <= 9+6, 12 <= 5+6+9, 13 <= 2+5+6, 10 <= 1+2+5+6...
例如,我正在寻找某种动态计算k的ave.
我可以用for循环来做,但我在这里寻找更优雅的方式:
vTR = c(10,15,12,13,10,15,10)
# element to sum
element = c(9,6,5,2,1,9,1)
res = c()
j = 1
k = 0
sumE = 0
for (i in 1:length(vTR)){
  k = k+1
  sumE = sum(element[j:k])
  if (sumE < vTR[i]) {
    res[length(res)+1] = NA
    next
  }
  repeat {
    j = j + 1
    sumE = sum(element[j:k])
    if (sumE < vTR[i]) {
      j = j-1
      res[length(res)+1] = k-j +1 
      break
    }
  }
}
# > res
# [1] NA  2  3  3  4  4  2
与sapply我们可以在每个元件中循环vTR,并采取所述第一x值,反向并采取累积求和并找到索引时的值跨过vTR[x]值.
sapply(seq_along(vTR),function(x) which.max(cumsum(rev(head(element, x)))>=vTR[x]))
#[1] 1 2 3 3 4 4 2
为了获得确切的预期输出,我们可以通过修改它
sapply(seq_along(vTR), function(x) {
  val = cumsum(rev(head(element, x)))
  if (sum(val)  >= vTR[x])
    which.max(val >= vTR[x])
  else
    NA
})
#[1] NA  2  3  3  4  4  2