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

topnfunción que es más rápida quesort,orderynth. Mira la documentación.Respuestas:
Usa el
partialargumento 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 boundsAlguna idea de cuál podría ser el problema? Algunos detalles: Mi x es un vector numérico de longitud 4706 con algunosNAs en los datos. Intenté obtener el segundo valor más alto en el vector usando exactamente el mismo código que sugirió @RobHyndman.decreasingargumento 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::nthpuede 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.sortcon 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 vectorvsería:fuente
Puede usar la
sortpalabra clave de esta manera:Ejemplo:
dará los primeros 5 números máximos.
fuente