Самый быстрый способ найти второе (третье ...) самое высокое / самое низкое значение в векторе или столбце - PullRequest
148 голосов
/ 16 марта 2010

R предлагает максимальное и минимальное значения, но я не вижу действительно быстрого способа найти другое значение в порядке, кроме сортировки всего вектора и выбора значения x из этого вектора.

Есть ли более быстрый способ получить второе по величине значение (например,)?

Спасибо

Ответы [ 14 ]

0 голосов
/ 31 мая 2017

Это найдет индекс N-го наименьшего или наибольшего значения во входном числовом векторе x. Установите bottom = TRUE в аргументах, если вы хотите, чтобы N-е снизу, или bottom = FALSE, если вы хотите, чтобы N-й сверху. N = 1 и bottom = TRUE эквивалентно which.min, N = 1 и bottom = FALSE эквивалентно which.max.

FindIndicesBottomTopN <- function(x=c(4,-2,5,-77,99),N=1,bottom=FALSE)
{

  k1 <- rank(x)
  if(bottom==TRUE){
    Nindex <- which(k1==N)
    Nindex <- Nindex[1]
  }

  if(bottom==FALSE){
    Nindex <- which(k1==(length(x)+1-N))
    Nindex <- Nindex[1]
  }

  return(Nindex)
}
0 голосов
/ 14 июня 2016

Вы можете использовать ключевое слово sort, например:

sort(unique(c))[1:N]

Пример:

c <- c(4,2,44,2,1,45,34,2,4,22,244)
sort(unique(c), decreasing = TRUE)[1:5]

даст первые 5 максимальных чисел.

0 голосов
/ 06 июня 2016
topn = function(vector, n){
  maxs=c()
  ind=c()
  for (i in 1:n){
    biggest=match(max(vector), vector)
    ind[i]=biggest
    maxs[i]=max(vector)
    vector=vector[-biggest]
  }
  mat=cbind(maxs, ind)
  return(mat)
}

эта функция вернет матрицу с верхними значениями n и их индексами. Надеюсь, поможет VDevi-Chou

0 голосов
/ 18 марта 2016

Следующее более высокое значение можно определить с помощью cummax(). Например, если вы хотите указать местоположение каждого нового более высокого значения, вы можете передать свой вектор значений cummax() в функцию diff(), чтобы определить места, в которых изменилось значение cummax(). скажем, у нас есть вектор

v <- c(4,6,3,2,-5,6,8,12,16)
cummax(v) will give us the vector
4  6  6  6  6  6  8 12 16

Теперь, если вы хотите найти место изменения в cummax(), у вас есть много опций, которые я обычно использую sign(diff(cummax(v))). Вы должны скорректировать потерянный первый элемент из-за diff(). Полный код для вектора v будет:

which(sign(diff(cummax(v)))==1)+1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...