R предлагает максимум и минимум, но я не вижу действительно быстрого способа найти другое значение в порядке, кроме сортировки всего вектора и последующего выбора значения x из этого вектора.
Например, есть ли более быстрый способ получить второе по величине значение?
topn
функцию , которая быстрееsort
,order
иnth
. Посмотри документацию.Ответы:
В Rfast есть функция nth_element, которая делает именно то, что вы просите, и работает быстрее, чем все реализации, описанные выше.
Также рассмотренные выше методы, основанные на частичной сортировке, не поддерживают поиск k наименьших значений
Вернет 5-й по величине элемент х, в то время как
Вернет 5-й самый маленький элемент х
Приведенные ниже контрольные показатели в отношении наиболее популярных ответов.
Для 10 тысяч номеров:
Для 1 миллиона номеров:
источник
Rfast::nth
может возвращать несколько элементов (например, 8-й и 9-й по величине элементы), а также индексы этих элементов.Используйте
partial
аргументsort()
. Для второго по величине значения:источник
sort(x, TRUE)[2]
что описано в ответе @ Abrar, помимо несоблюдения ограничения в вопросе?Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : index 4705 outside bounds
Любая идея, в чем может быть проблема? Некоторые детали: My x - это числовой вектор длиной 4706 с некоторымиNA
s в данных. Я попытался получить второе по величине значение в векторе, используя тот же код, который предложил @RobHyndman.decreasing
аргумент не совместим с частичной сортировкой, вы всегда можете-sort(-x, partial=n-1)[n-1]
; это логически то же самое и занимает значительно меньше времени, чемsort(x, decreasing=TRUE)[n-1]
.Немного более медленная альтернатива, только для записей:
источник
max(x[-which.max(x)])
Я обернул ответ Роба в чуть более общую функцию, которую можно использовать, чтобы найти 2-й, 3-й, 4-й (и т. Д.) Максимум:
источник
maxN(1:10, 1:3)
(я бы по умолчанию установил N на 1)Вот простой способ найти индексы N самых маленьких / самых больших значений в векторе (пример для N = 3):
N Наименьший:
N Largest:
Таким образом, вы можете извлечь значения как:
источник
Для n-го наивысшего значения,
источник
Я обнаружил, что сначала удаляем элемент max, а затем выполняем еще один максимальный прогон с сопоставимой скоростью:
источник
Вот самый простой способ, который я нашел,
источник
Когда я недавно искал R возвращающую индексы верхних чисел N max / min в данном векторе, я был удивлен, что такой функции нет.
И это нечто очень похожее.
Решение грубой силы, использующее функцию base :: order, кажется самым простым.
Но он не самый быстрый, если ваше значение N относительно мало по сравнению с длиной вектора x .
С другой стороны, если N действительно мало, вы можете использовать функцию base :: whichMax итеративно, и в каждой итерации вы можете заменить найденное значение на -Inf
Я полагаю, что вы видите проблему - природу копирования при модификации R. Таким образом, это будет работать лучше для очень очень очень малого N (1,2,3), но будет быстро замедляться при больших значениях N. И вы перебираете все элементы вектора x N раз.
Я думаю, что лучшим решением в чистом R является использование частичного base :: sort .
Затем вы можете выбрать последний ( N- й) элемент из результата функций, описанных выше.
Примечание: функции, определенные выше, являются просто примерами - если вы хотите использовать их, вы должны проверить / рассудить входные данные (например, N> length (x) ).
Я написал небольшую статью о чем-то очень похожем (получить индексы верхних значений N max / min вектора) по адресу http://palusga.cz/?p=18 - здесь вы можете найти некоторые тесты аналогичных функций, которые я определил выше.
источник
head(sort(x),..)
илиtail(sort(x),...)
должен работатьисточник
эта функция вернет матрицу с верхними значениями n и их индексами. надеюсь, это поможет VDevi-Chou
источник
Это найдет индекс N-го наименьшего или наибольшего значения во входном числовом векторе x. Установите bottom = TRUE в аргументах, если вы хотите, чтобы N-е снизу, или bottom = FALSE, если вы хотите, чтобы N-й сверху. N = 1 и bottom = TRUE эквивалентны which.min, N = 1 и bottom = FALSE эквивалентны which.max.
источник
У dplyr есть функция nth, где первый аргумент - вектор, а второй - место, которое вы хотите. Это касается и повторяющихся элементов. Например:
Нахождение второго по величине значения:
источник
x[[order(order_by)[[n]]]]
- так что требуется сортировка всего вектора. Так что это будет не так быстро, как принятый ответ.sort
с аргументом частичного = (который меняет все)dplyr::nth()
?bench::mark(max(x[-which.max(x)]), x[[order(-x)[[2]]]] )
,nth()
Кажется , почти в 10 раз медленнее, гдеlength(x)
есть 3 миллиона человек .Вы можете идентифицировать следующее более высокое значение с
cummax()
. Например, если вы хотите указать местоположение каждого нового более высокого значения, вы можете передать свой векторcummax()
значений вdiff()
функцию, чтобы определить местоположения, в которых этоcummax()
значение изменилось. скажем, у нас есть векторТеперь, если вы хотите найти место изменения, у
cummax()
вас есть много вариантов, которые я склонен использоватьsign(diff(cummax(v)))
. Вы должны скорректировать потерянный первый элемент из-заdiff()
. Полный код для вектораv
будет:источник
Вы можете использовать
sort
ключевое слово следующим образом:Пример:
даст первые 5 максимальных чисел.
источник