R - я не понимаю, почему мой код генерирует счет, а не сумму - PullRequest
0 голосов
/ 17 октября 2019

У меня есть список из 10000 значений, которые выглядят следующим образом

      Points
1    118
2    564
3     15
4    729
5     49
6    614

Вызов списка t1 и запуск sum(t1>quantile(t(t1),0.8)) Я бы ожидал получить сумму значений в списке, которые большечем 80-й квантиль, но то, что я действительно получаю, это количество (а не сумма) всех значений.

Ответы [ 4 ]

1 голос
/ 17 октября 2019

Вы можете использовать функцию ifelse, которая добавит t1, если t1 выше вашего порога и 0 в противном случае

sum(ifelse(t1>quantile(t(t1),0.8),t1,0))
1 голос
/ 17 октября 2019

Попробуйте это:

sum(t1[t1>quantile(t(t1),0.8), ])

Чтобы увидеть разницу, проверьте t1>quantile(t(t1),0.8), а затем t1[t1>quantile(t(t1),0.8), ].

Один является логическим вектором и содержит TRUE (соответственно 1)если значение больше 80% квантиля и ноль в противном случае. Другое значение t1 оценивается по этому логическому вектору, поэтому возвращаются только значения, превышающие квантиль 80%

1 голос
/ 17 октября 2019

Вот пример:

set.seed(123)
df <- data.frame(Point = rnorm(10000))
sum(df$Point > quantile(df$Point, 0.8))

Вторая строка возвращает сумму для логического вектора (TRUE/FALSE), следовательно, вы получаете счетчик (количество раз, которое TRUE происходит). Используйте

sum(df$Point[df$Point > quantile(df$Point, 0.8)])

, чтобы получить то, что вы хотите.

1 голос
/ 17 октября 2019

t1>quantile(t(t1),0.8) - логическое значение, т. Е. Последовательность значений ИСТИНА / ЛОЖЬ (это можно легко проверить). Следовательно, sum этого вектора - это число вхождений значений TRUE, то есть количество лиц, которые удовлетворяют указанному условию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...