gpt4 book ai didi

r - 如何继续删除第一个值,直到向量的总和小于 20?

转载 作者:行者123 更新时间:2023-12-04 01:33:15 26 4
gpt4 key购买 nike

我正在寻找一个函数,它接受一个向量并不断删除第一个值,直到向量的总和小于 20。返回剩余的值。

我已经尝试了 for 循环和 while 循环,但找不到解决方案。

vec <- c(3,5,3,4,3,9,1,8,2,5)

short <- function(vec){

for (i in 1:length(vec)){
while (!is.na((sum(vec)) < 20)){
vec <- vec[i+1:length(vec)]
#vec.remove(i)
}
}

预期的输出应该是: 1,8,2,5小于 20。

最佳答案

查看预期输出,您似乎想要删除值,直到剩余值的总和小于 20。

我们可以创建一个函数

drop_20 <- function(vec) {
tail(vec, sum(cumsum(rev(vec)) < 20))
}

drop_20(vec)
#[1] 1 8 2 5

在另一个输入上尝试
drop_20(1:10)
#[1] 9 10

分解功能,首先是 vec
vec = c(3,5,3,4,3,9,1,8,2,5)

然后我们 rev写它
rev(vec)
#[1] 5 2 8 1 9 3 4 3 5 3

对它进行累计总和( cumsum )
cumsum(vec)
#[1] 3 8 11 15 18 27 28 36 38 43

找出小于 20 的条目数
cumsum(rev(vec)) < 20
#[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE

sum(cumsum(rev(vec)) < 20)
#[1] 4

最后使用 tail 对这些最后一个条目进行子集化.

对代码稍加修改,应该可以处理 NA也是
drop_20 <- function(vec) {
tail(vec, sum(cumsum(replace(rev(vec), is.na(rev(vec)), 0)) < 20))
}

vec = c(3, 2, NA, 4, 5, 1, 2, 3, 4, 9, NA, 1, 2)
drop_20(vec)
#[1] 3 4 9 NA 1 2

逻辑是我们 replace NA用零然后取 cumsum

关于r - 如何继续删除第一个值,直到向量的总和小于 20?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54212081/

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