gpt4 book ai didi

r - 达到累加和的元素数量

转载 作者:行者123 更新时间:2023-12-02 15:32:23 25 4
gpt4 key购买 nike

我需要输出(对于进一步的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...

例如,我正在寻找某种 ave,其中 k 是动态计算的。

我可以用 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

关于r - 达到累加和的元素数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49872475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com