Comprender la función order ()

Estoy tratando de entender cómo funciona la función order() . Tenía la impresión de que devolvía una permutación de índices, que una vez ordenados, ordenarían el vector original.

Por ejemplo,

 > a  order(a) [1] 3 1 2 4 

Hubiera esperado que esto devuelva c(2, 3, 1, 4) , ya que la lista ordenada sería 10 45 50 96.

¿Alguien puede ayudarme a entender el valor de retorno de esta función?

Esto parece explicarlo.

La definición de order es que a[order(a)] está en orden creciente. Esto funciona con su ejemplo, donde el orden correcto es el cuarto, segundo, primer y tercer elemento.

Es posible que haya estado buscando rank , que devuelve el rango de los elementos
R> a < - c(4.1, 3.2, 6.1, 3.1)
R> order(a)
[1] 4 2 1 3
R> rank(a)
[1] 3 2 4 1
así que el rank te dice en qué orden están los números, order te dice cómo obtenerlos en orden ascendente.

plot(a, rank(a)/length(a)) dará una gráfica de la CDF. Sin embargo, para ver por qué el order es útil, intenta plot(a, rank(a)/length(a),type="S") que da un desorden, porque los datos no están en orden creciente

Si lo hiciste
oo< -order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
o simplemente
oo< -order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
obtienes un gráfico de líneas del CDF.

Apuesto a que estás pensando en el rango.

Para ordenar un vector 1D o una sola columna de datos, simplemente llame a la función de clasificación y pase su secuencia.

Por otro lado, la función de orden es necesaria para ordenar datos de dos dimensiones, es decir, múltiples columnas de datos recostackdos en una matriz o dataframe.

 Stadium Home Week Qtr Away Off Def Result Kicker Dist 751 Out PHI 14 4 NYG PHI NYG Good D.Akers 50 491 Out KC 9 1 OAK OAK KC Good S.Janikowski 32 702 Out OAK 15 4 CLE CLE OAK Good P.Dawson 37 571 Out NE 1 2 OAK OAK NE Missed S.Janikowski 43 654 Out NYG 11 2 PHI NYG PHI Good J.Feely 26 307 Out DEN 14 2 BAL DEN BAL Good J.Elam 48 492 Out KC 13 3 DEN KC DEN Good L.Tynes 34 691 Out NYJ 17 3 BUF NYJ BUF Good M.Nugent 25 164 Out CHI 13 2 GB CHI GB Good R.Gould 25 80 Out BAL 1 2 IND IND BAL Good M.Vanderjagt 20 

Aquí hay un extracto de datos para los bashs de gol de campo en la temporada 2008 de la NFL, un dataframe que he llamado ‘fg’. supongamos que estos 10 puntos de datos representan todos los objectives de campo intentados en 2008; supongamos además que desea saber la distancia del objective de campo más largo intentado ese año, quién lo pateó y si fue bueno o no; también desea saber la segunda más larga, la tercera más larga, etc. y finalmente quieres el bash más corto de gol de campo.

Bueno, podrías hacer esto:

 sort(fg$Dist, decreasing=T) 

que devuelve: 50 48 43 37 34 32 26 25 25 20

Eso es correcto, pero no muy útil, nos dice la distancia del bash de campo más largo, el segundo más largo, … así como el más corto; sin embargo, pero eso es todo lo que sabemos, por ejemplo, no sabemos quién fue el golpeador, si el bash fue exitoso, etc. Por supuesto, necesitamos el dataframe completo ordenado en la columna “Dist” (dicho de otro modo, desea ordenar todas las filas de datos en el único atributo Dist . que se vería así:

 Stadium Home Week Qtr Away Off Def Result Kicker Dist 751 Out PHI 14 4 NYG PHI NYG Good D.Akers 50 307 Out DEN 14 2 BAL DEN BAL Good J.Elam 48 571 Out NE 1 2 OAK OAK NE Missed S.Janikowski 43 702 Out OAK 15 4 CLE CLE OAK Good P.Dawson 37 492 Out KC 13 3 DEN KC DEN Good L.Tynes 34 491 Out KC 9 1 OAK OAK KC Good S.Janikowski 32 654 Out NYG 11 2 PHI NYG PHI Good J.Feely 26 691 Out NYJ 17 3 BUF NYJ BUF Good M.Nugent 25 164 Out CHI 13 2 GB CHI GB Good R.Gould 25 80 Out BAL 1 2 IND IND BAL Good M.Vanderjagt 20 

Esto es lo que hace el orden . Es ‘tipo’ para datos bidimensionales; Dicho de otra manera, devuelve un índice entero de 1D compuesto por los números de fila de manera que ordenar las filas de acuerdo con ese vector, le daría una clasificación correcta orientada a filas en la columna Dist

Así es como funciona. Arriba, el tipo se usó para ordenar la columna Dist; para ordenar todo el dataframe en la columna Dist, usamos ‘orden’ exactamente de la misma manera que ‘ordenar’ se usa arriba :

 ndx = order(fg$Dist, decreasing=T) 

(Por lo general, vinculo la matriz devuelta de ‘orden’ a la variable ‘ndx’, que significa ‘índice’, porque la voy a usar como una matriz de índice para ordenar).

ese fue el paso 1, aquí está el paso 2:

‘ndx’, lo que se devuelve con ‘sort’ se usa luego como una matriz de índice para reordenar el dataframe, ‘fg’:

 fg_sorted = fg[ndx,] 

fg_sorted es el cuadro de datos reordenado inmediatamente anterior.

En resumen, ‘sort’ se usa para crear una matriz de índice (que especifica el orden de clasificación de la columna que desea ordenar), que luego se usa como matriz de índice para reordenar la estructura de datos (o matriz).

(Pensé que sería útil exponer las ideas muy simplemente aquí para resumir el buen material publicado por @doug, y vinculado por @duffymo; +1 a cada uno, por cierto).

? orden le indica qué elemento del vector original debe ponerse primero, segundo, etc., para ordenar el vector original, mientras que ? rango le indica qué elemento tiene el valor más bajo, el segundo más bajo, etc. Por ejemplo:

 > a < - c(45, 50, 10, 96) > order(a) [1] 3 1 2 4 > rank(a) [1] 2 3 1 4 

Entonces el order(a) está diciendo, ‘pon el tercer elemento primero cuando rank(a) …’, mientras que el rank(a) está diciendo, ‘el primer elemento es el segundo más bajo …’. (Tenga en cuenta que ambos acuerdan qué elemento es el más bajo, etc., simplemente presentan la información de manera diferente). Así vemos que podemos usar order() para ordenar, pero no podemos usar rank() esa manera:

 > a[order(a)] [1] 10 45 50 96 > sort(a) [1] 10 45 50 96 > a[rank(a)] [1] 50 10 45 96 

En general, order() no será igual a rank() menos que el vector ya haya sido ordenado:

 > b < - sort(a) > order(b)==rank(b) [1] TRUE TRUE TRUE TRUE 

Además, dado que order() está (esencialmente) operando sobre los rangos de los datos, usted puede componerlos sin afectar la información, pero a la inversa produce un galimatías:

 > order(rank(a))==order(a) [1] TRUE TRUE TRUE TRUE > rank(order(a))==rank(a) [1] FALSE FALSE FALSE TRUE 

Ejecutar este pequeño código me permitió entender la función de orden

 x < - c(3, 22, 5, 1, 77) cbind( index=1:length(x), rank=rank(x), x, order=order(x), sort=sort(x) ) index rank x order sort [1,] 1 2 3 4 1 [2,] 2 4 22 1 3 [3,] 3 3 5 3 5 [4,] 4 1 1 2 22 [5,] 5 5 77 5 77 

Referencia: http://r.789695.n4.nabble.com/I-don-t-understand-the-order-function-td4664384.html

Esto podría ayudarte en algún momento.

 a < - c(45,50,10,96) a[order(a)] 

Lo que obtienes es

 [1] 10 45 50 96 

El código que escribí indica que desea "a" como un subconjunto completo de "a" y desea que se ordene desde el valor más bajo al más alto.

En palabras simples, order() da la ubicación de elementos de magnitud creciente.

Por ejemplo, el order(c(10,20,30)) dará 1,2,3 y el order(c(30,20,10)) dará 3,2,1 .