Я бы написал функцию, которая возвращает количество элементов вектора, необходимое для сложения не менее 0,9, na.rm = T, а затем применяет его по строкам к соответствующим столбцам df:
get.length <- function(x) {
ind <- which.max(x)
sum <- max(x)
if (sum >= .9) {
return(1)
} else {
while (sum < .9 & length(ind) != length(x)) {
ind <- c(ind, which.max(x[-ind]))
sum <- sum(x[ind], na.rm = T)
}
}
if (sum < .9) return(NA) else return(length(ind))
}
Функция ищет максимальное значение вектора и, если оно меньше 0, добавляет следующее наибольшее и повторяется. По достижении 0,9 возвращается количество элементов, необходимое для суммирования не менее 0,9. Если они этого не делают, он возвращает NA
.
Примечание. Даже если ваши компьютеры будут стоить меньше, функция работает, даже если элементы не отсортированы в порядке убывания.
Вы можете применить функцию к индексам столбцов вашего фрейма данных df
следующим образом:
apply(df[ , col_indices], 1, get.length)