R oferece max e min, mas não vejo uma maneira muito rápida de encontrar outro valor na ordem, além de classificar o vetor inteiro e escolher o valor x desse vetor.
Existe uma maneira mais rápida de obter o segundo valor mais alto (por exemplo)?
obrigado
topn
função que é mais rápida quesort
,order
enth
. Veja a documentação.Respostas:
Use o
partial
argumento desort()
. Para o segundo valor mais alto:fonte
sort(x, TRUE)[2]
descrito na resposta de @ Abrar, além de não satisfazer a restrição da pergunta?Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : index 4705 outside bounds
Alguma idéia de qual pode ser o problema? Alguns detalhes: Meu x é um vetor numérico de comprimento 4706 com algunsNA
s nos dados. Tentei obter o segundo valor mais alto do vetor usando exatamente o mesmo código sugerido pelo @RobHyndman.decreasing
argumento não seja compatível com a classificação parcial, você pode sempre-sort(-x, partial=n-1)[n-1]
; é logicamente a mesma coisa e leva consideravelmente menos tempo quesort(x, decreasing=TRUE)[n-1]
.Alternativa um pouco mais lenta, apenas para os registros:
fonte
max(x[-which.max(x)])
Coloquei a resposta de Rob em uma função um pouco mais geral, que pode ser usada para encontrar o 2º, 3º, 4º (etc.) máximo:
fonte
maxN(1:10, 1:3)
(eu teria definir o N padrão a 1)Rfast tem uma função chamada nth_element que faz exatamente o que você pede e é mais rápida que todas as implementações discutidas acima
Além disso, os métodos discutidos acima, baseados em classificação parcial, não suportam encontrar os k menores valores
Retornará o quinto maior elemento de x, enquanto
Retornará o quinto elemento menor de x
Referências abaixo em relação às respostas mais populares.
Para 10 mil números:
Para 1 milhão de números:
fonte
Rfast::nth
pode retornar vários elementos (por exemplo, 8º e 9º maiores elementos), bem como os índices desses elementos.Aqui está uma maneira fácil de encontrar os índices de N menores / maiores valores em um vetor (exemplo para N = 3):
N Menor:
N Maior:
Então você pode extrair os valores como:
fonte
Para o enésimo valor mais alto,
fonte
Descobri que remover o elemento max primeiro e depois executar outro max é executado em velocidade comparável:
fonte
Aqui está a maneira mais simples que encontrei,
fonte
Recentemente, quando eu estava procurando por uma função R retornando índices dos principais números N max / min em um determinado vetor, fiquei surpreso por não haver essa função.
E isso é algo muito semelhante.
A solução de força bruta usando a função base :: order parece ser a mais fácil.
Mas não é o mais rápido, caso o valor de N seja relativamente pequeno comparado ao comprimento do vetor x .
Por outro lado, se N é realmente pequeno, você pode usar a função base :: whichMax iterativamente e em cada iteração você pode substituir o valor encontrado por -Inf
Acredito que você veja o problema - a natureza de copiar na modificação de R. Portanto, isso terá um desempenho melhor para N muito muito muito pequeno (1,2,3), mas diminuirá rapidamente para valores de N maiores. E você está iterando sobre todos os elementos no vetor x N vezes.
Eu acho que a melhor solução no R limpo é usar parcial base :: sort .
Depois, você pode selecionar o último ( N item de th) a partir do resultado das funções defiend acima.
Nota: as funções definidas acima são apenas exemplos - se você quiser usá-las, deverá verificar as entradas / sanidade (por exemplo, N> length (x) ).
Escrevi um pequeno artigo sobre algo muito semelhante (obtenha índices dos principais valores máximos de N / min de um vetor) em http://palusga.cz/?p=18 - você pode encontrar aqui alguns benchmarks de funções semelhantes que defini acima.
fonte
head(sort(x),..)
outail(sort(x),...)
deve funcionarfonte
essa função retornará uma matriz com os n valores superiores e seus índices. espero que ajude VDevi-Chou
fonte
Isso localizará o índice do enésimo menor ou maior valor no vetor numérico de entrada x. Defina bottom = TRUE nos argumentos se você quiser o N'th do fundo, ou bottom = FALSE se você quiser o N'th do topo. N = 1 e inferior = TRUE é equivalente a qual.min, N = 1 e inferior = FALSE é equivalente a qual.max.
fonte
O dplyr tem a função enésima, onde o primeiro argumento é o vetor e o segundo é o local que você deseja. Isso vale para repetir elementos também. Por exemplo:
Encontrando o segundo maior valor:
fonte
x[[order(order_by)[[n]]]]
- portanto, é necessário classificar todo o vetor. Portanto, não será tão rápido quanto a resposta aceita.sort
com o parcial = argumento (que muda tudo)dplyr::nth()
?bench::mark(max(x[-which.max(x)]), x[[order(-x)[[2]]]] )
,nth()
parece quase 10 vezes mais lento, ondelength(x)
são 3 milhões.Você pode identificar o próximo valor mais alto com
cummax()
. Se você deseja a localização de cada novo valor mais alto, por exemplo, pode passar seu vetor decummax()
valores para adiff()
função para identificar os locais nos quais ocummax()
valor foi alterado. diga que temos o vetorAgora, se você deseja encontrar o local de uma alteração,
cummax()
tem muitas opções que eu costumo usarsign(diff(cummax(v)))
. Você deve ajustar o primeiro elemento perdido por causa dediff()
. O código completo para vetorv
seria:fonte
Você pode usar a
sort
palavra - chave assim:Exemplo:
dará os 5 primeiros números máximos.
fonte