Нахождение количества элементов с помощью специального цикла с условием

#r #sum #cycle

Вопрос:

У меня есть простой набор данных с цифровыми значениями. Например, xlt;-c(3,4,6,7,8,4,5,3,4,3,5,6) . Мне нужно подсчитать количество элементов следующим образом: мне нужно найти минимальное количество элементов, которые удовлетворяют условию: первый элемент/сумма всех элементов должна быть больше 0,95 или первый элемент плюс второй элемент/сумма всех элементов должна быть больше 0,95 и так далее. Например, 3/58lt;0,95; 3 4/58lt;0,95; 3 4 6/58 Я должен остановиться, когда он будет больше 0,95, и подсчитать количество элементов, которые я использовал набор данных frm. Как я могу это сделать?

Комментарии:

1. Исходя из примера, сумма меньше 95

2. @akrun может быть, я подал плохой пример, я говорю это в целом, мне нужны какие-либо идеи, как это сделать

3. Я бы использовал n lt;- 1;head(x[cumsum(x)gt;95], n) , если вы хотите подмножество вектора

4. @akrun Я отредактировал свой вопрос, чтобы дать более четкое объяснение

5. Вам может понадобиться sum(cumsum(x) lt; 95)

Ответ №1:

 min(which(cumsum(x)/sum(x) gt; 0.95)) #[1] 12  

Это дает, какой элемент в x первом имеет суммарную сумму до того момента, которая превышает 95% от общей суммы x .

В этом случае общее число x составляет 58, и 95% из них составляет 55,1. На 11-м элементе x , общая сумма составляет всего 58-6 = 52, поэтому вам нужно, чтобы все 12 элементов составили более 55,1.

Комментарии:

1. Еще один вопрос, если я хочу показать элементы, соответствующие такому условию, как я могу это сделать?

2. Потому что есть проблема, если я сделаю такую сумму(x)/сумму(x)

3. Возможно, это помогло бы взглянуть data.frame(x, cuml = cumsum(x), cuml_share = cumsum(x)/sum(x), exceeds = cumsum(x)/sum(x) gt; 0.95) , чтобы понять, что происходит.