R ofrece max y min, pero no veo una forma realmente rápida de encontrar el otro valor en el orden, aparte de ordenar el vector completo y no elegir el valor x de este vector.
¿Hay alguna forma más rápida de obtener el segundo valor más alto (p. Ej.)?
Gracias
topn
función que es más rápida quesort
,order
ynth
. Mira la documentación.Respuestas:
Usa el
partial
argumento desort()
. Para el segundo valor más alto:fuente
sort(x, TRUE)[2]
lo descrito en la respuesta de @ Abrar, además de no satisfacer la restricción en la pregunta?Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : index 4705 outside bounds
Alguna idea de cuál podría ser el problema? Algunos detalles: Mi x es un vector numérico de longitud 4706 con algunosNA
s en los datos. Intenté obtener el segundo valor más alto en el vector usando exactamente el mismo código que sugirió @RobHyndman.decreasing
argumento no es compatible con la ordenación parcial, siempre puedes-sort(-x, partial=n-1)[n-1]
; lógicamente es lo mismo y lleva mucho menos tiempo quesort(x, decreasing=TRUE)[n-1]
.Alternativa ligeramente más lenta, solo para los registros:
fuente
max(x[-which.max(x)])
Envolví la respuesta de Rob en una función un poco más general, que se puede usar para encontrar el segundo, tercero, cuarto (etc.) máximo:
fuente
maxN(1:10, 1:3)
(hubiera configurado el valor predeterminado N a 1)Rfast tiene una función llamada nth_element que hace exactamente lo que le pides y es más rápida que todas las implementaciones discutidas anteriormente
Además, los métodos discutidos anteriormente que se basan en una ordenación parcial, no admiten encontrar los k valores más pequeños
Devolverá el quinto elemento más grande de x, mientras que
Devolverá el quinto elemento más pequeño de x
Los puntos de referencia a continuación contra las respuestas más populares.
Por 10 mil números:
Para 1 millón de números:
fuente
Rfast::nth
puede devolver múltiples elementos (por ejemplo, el octavo y el noveno elemento más grande), así como los índices de esos elementos.Aquí hay una manera fácil de encontrar los índices de N valores más pequeños / más grandes en un vector (Ejemplo para N = 3):
N más pequeño:
N más grande:
Para que pueda extraer los valores como:
fuente
Para el enésimo valor más alto,
fuente
Descubrí que eliminar el elemento max primero y luego hacer otra carrera máxima a una velocidad comparable:
fuente
Aquí está la forma más simple que encontré,
fuente
Cuando estaba buscando recientemente una función R que devolviera índices de los N números máximos / mínimos superiores en un vector dado, me sorprendió que no existiera dicha función.
Y esto es algo muy similar.
La solución de fuerza bruta usando la función base :: order parece ser la más fácil.
Pero no es el más rápido en caso de que su valor de N sea relativamente pequeño en comparación con la longitud del vector x .
Por otro lado, si la N es realmente pequeña, puede usar la función base :: whichMax de forma iterativa y en cada iteración puede reemplazar el valor encontrado por -Inf
Creo que usted ve el problema: la naturaleza de copiar y modificar de R. Por lo tanto, funcionará mejor para N muy muy pequeño (1,2,3) pero se ralentizará rápidamente para valores de N más grandes. Y está iterando sobre todos los elementos en vector x N veces.
Creo que la mejor solución en clean R es usar parcial base :: sort .
Luego puede seleccionar el último ( N º) elemento del resultado de las funciones definidas anteriormente.
Nota: las funciones definidas anteriormente son solo ejemplos: si desea usarlas, debe verificar / controlar las entradas (por ejemplo, N> longitud (x) ).
Escribí un pequeño artículo sobre algo muy similar (obtenga índices de los valores máximos de N máximos / mínimos de un vector) en http://palusga.cz/?p=18 ; aquí puede encontrar algunos puntos de referencia de funciones similares que definí anteriormente.
fuente
head(sort(x),..)
otail(sort(x),...)
debería funcionarfuente
Esta función devolverá una matriz con los valores superiores de n y sus índices. espero que ayude a VDevi-Chou
fuente
Esto encontrará el índice del enésimo valor más pequeño o más grande en el vector numérico de entrada x. Establezca bottom = TRUE en los argumentos si desea el N'th desde abajo, o bottom = FALSE si desea el N'th desde arriba. N = 1 y bottom = TRUE es equivalente a which.min, N = 1 y bottom = FALSE es equivalente a which.max.
fuente
dplyr tiene la función nth, donde el primer argumento es el vector y el segundo es el lugar que desea. Esto también se aplica a elementos repetitivos. Por ejemplo:
Encontrar el segundo valor más grande:
fuente
x[[order(order_by)[[n]]]]
, por lo que requiere ordenar todo el vector. Por lo tanto, no será tan rápido como la respuesta aceptada.sort
con el argumento parcial = (que lo cambia todo)dplyr::nth()
?bench::mark(max(x[-which.max(x)]), x[[order(-x)[[2]]]] )
,nth()
parece casi 10 veces más lento, dondelength(x)
son 3 millones.Puede identificar el siguiente valor más alto con
cummax()
. Si desea la ubicación de cada nuevo valor superior, por ejemplo, puede pasar su vector decummax()
valores a ladiff()
función para identificar las ubicaciones en las quecummax()
cambió el valor. decimos que tenemos el vectorAhora, si desea encontrar la ubicación de un cambio
cummax()
, tiene muchas opciones que suelo usarsign(diff(cummax(v)))
. Tienes que ajustar por el primer elemento perdido debido adiff()
. El código completo para el vectorv
sería:fuente
Puede usar la
sort
palabra clave de esta manera:Ejemplo:
dará los primeros 5 números máximos.
fuente