R 要达到累计和的元素数

R 要达到累计和的元素数,r,vectorization,R,Vectorization,我需要输出(对于进一步的zoo: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 &l

我需要输出(对于进一步的zoo: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...
#要达到的值
vTR=c(10,15,12,13,10,15,10)
#要求和的元素
元素=c(9,6,5,2,1,9,1)
magicFoo(录像机,元素)
#应该返回c(NA,2,3,3,4,4,2)

#10~NA,15使用
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

为了提高计算速度,我稍微修改了Ronak Shah的非常好的公式,使其以接近n的形式运行,即n²:

nbIndexForCumSum = function(vTR, element) {
  rs = rev(c(0,cumsum(rev(element))))
  j = 1
  unlist(sapply(seq_along(vTR), function(x) {
    while(j > 1 & rs[j] < vTR[x] + rs[x+1]) j <<- j-1
    res = length(rs[j:x]) - which.max(rs[j:x] < vTR[x] + rs[x+1]) + 2
    j <<- ifelse(x > res, x - res, 1)
    ifelse( rs[j] < vTR[x] + rs[x+1], NA, res) 
  }) )
}
nbIndexForCumSum=函数(vTR,元素){
rs=修订版(c(0,积数)(修订版(元素)))
j=1
未列出(沿顺序排列(vTR)、功能(x){

(j>1&rs[j]sapply()
解决方案是什么样子的?谢谢您教我这一点,我将用谷歌搜索如何做。
nbIndexForCumSum = function(vTR, element) {
  rs = rev(c(0,cumsum(rev(element))))
  j = 1
  unlist(sapply(seq_along(vTR), function(x) {
    while(j > 1 & rs[j] < vTR[x] + rs[x+1]) j <<- j-1
    res = length(rs[j:x]) - which.max(rs[j:x] < vTR[x] + rs[x+1]) + 2
    j <<- ifelse(x > res, x - res, 1)
    ifelse( rs[j] < vTR[x] + rs[x+1], NA, res) 
  }) )
}