#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)
, чтобы понять, что происходит.