Глядя на ожидаемый результат, похоже, что вы хотите сбросить значения до тех пор, пока сумма оставшихся значений не станет меньше 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