La comprensión de la orden de función ()
Pregunta
Estoy tratando de entender cómo funciona la función order()
. Yo tenía la impresión de que se volvió una permutación de los índices, que al ordenarse, lo solucionaría el vector original.
Por ejemplo,
> a <- c(45,50,10,96)
> order(a)
[1] 3 1 2 4
Me hubiera esperado esto para volver c(2, 3, 1, 4)
, ya que la lista ordenada sería 10 45 50 96.
Puede alguien ayudarme a entender el valor de retorno de esta función?
Solución
Este parece explicarlo.
La definición de
order
es que está ena[order(a)]
orden creciente. Esto funciona con su ejemplo, cuando la correcta orden es el cuarto segundo, primero, a continuación, tercer elemento,.Es posible que haya estado buscando
rank
, que devuelve el rango de la 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
por lo querank
qué orden los números están en cuenta,order
le indica cómo obtenerlos en orden ascendente.
plot(a, rank(a)/length(a))
dará un gráfico de la CDF. Para ver por quéorder
es útil, sin embargo,plot(a, rank(a)/length(a),type="S")
intento que da un desastre, porque los datos no están en orden crecienteSi lo hizo
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")
se obtiene un gráfico de líneas de la CDF.
te apuesto está pensando en rango.
Otros consejos
Para ordenar un vector 1D o una sola columna de datos, llame a la función de clasificación y pasan en su secuencia.
Por otro lado, la orden función es necesaria para ordenar los datos dos datos -dimensional - es decir, múltiples columnas de datos recogidos en una matriz o trama de datos.
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
A continuación se muestra un extracto de los datos para los intentos de gol de campo en la temporada 2008 de la NFL, una trama de datos que he llamado 'fg'. supongamos que estos 10 puntos de datos representan todos los intentos de goles de campo en 2008; Supongamos, además, que quiere saber la distancia del gol de campo más largo intentó ese año, que le dio una patada, y si era bueno o no; También quiere saber la segunda más larga, así como la tercera más larga, etc .; y por último que desea el menor intento de gol de campo.
Bueno, usted podría simplemente hacer esto:
sort(fg$Dist, decreasing=T)
que devuelve: 50 48 43 37 34 32 26 25 25 20
Eso es correcto, pero no es muy útil - que nos dice la distancia de los más largos intento de gol de campo, 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 era el golpeador, si el intento fue exitoso, etc. Por supuesto, necesitamos toda la trama de datos ordenados en la columna "Dist" (dicho de otra manera, desee 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 Para ¿Tiene es 'tipo' para los datos bidimensionales.; dicho de otro modo, devuelve un índice entero 1D compuesto por los números de fila de tal manera que la clasificación de las filas de acuerdo con ese vector, le daría una fila orientada especie en la columna correcta, Dist
Así es como funciona. Anterior, tipo se utilizó para ordenar la columna Dist; para ordenar toda la trama de datos en la columna Dist, utilizamos el 'orden' exactamente de la misma manera que 'especie' se utiliza por encima de
ndx = order(fg$Dist, decreasing=T)
(i generalmente enlazar la matriz de volver de 'orden' a la 'ndx' variable, lo que significa para el 'índice', porque voy a usarlo como una matriz de índice de clase.)
que era el paso 1, de aquí el paso 2:
'ndx', lo que se devuelve por 'especie' se utiliza entonces como una matriz índice a Reordenar la trama de datos, 'fg':
fg_sorted = fg[ndx,]
fg_sorted es la re-ordenado trama de datos inmediatamente por encima.
En resumen, 'especie' se utiliza para crear una matriz de índice (que especifica el orden de clasificación de la columna que desea clasificados), que luego se utiliza como una matriz de índice para reordenar la trama de datos (o matriz).
(pensé que podría ser útil para diseñar las ideas muy simple para resumir el material de buena Publicado por @doug, y unidos por @duffymo;. 1 a cada uno, por cierto)
? orden le dice qué elemento del original necesidades vector que se ponen primero, segundo, etc., a fin de ordenar el vector original, mientras que ? rango le dirá qué elemento tiene el más bajo, la segunda más baja, etc., valor. Por ejemplo:
> a <- c(45, 50, 10, 96)
> order(a)
[1] 3 1 2 4
> rank(a)
[1] 2 3 1 4
Así order(a)
está diciendo, 'poner el tercer elemento de primera clase cuando ...', mientras que rank(a)
está diciendo, 'El primer elemento es el segundo más bajo ...'. (Tenga en cuenta que ambos están de acuerdo en qué elemento es más bajo, etc .; sino que presentan la información de manera diferente.) Por lo tanto, vemos que podemos utilizar order()
al tipo, pero no podemos usar rank()
de 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 rank()
a menos que el vector se ha clasificado ya:
> b <- sort(a)
> order(b)==rank(b)
[1] TRUE TRUE TRUE TRUE
Además, dado que es order()
(esencialmente) que operan sobre filas de los datos, se puede componer sin afectar la información, pero a la inversa produce galimatías:
> order(rank(a))==order(a)
[1] TRUE TRUE TRUE TRUE
> rank(order(a))==rank(a)
[1] FALSE FALSE FALSE TRUE
La ejecución de esta pequeña pieza de 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 ayudarle en algún momento.
a <- c(45,50,10,96)
a[order(a)]
Lo que se obtiene es
[1] 10 45 50 96
El código que he escrito indica que desea "a" en su conjunto un subconjunto de "a" y quiere que ordenó desde el más bajo al más alto valor.
En palabras sencillas, order()
da las ubicaciones de elementos de magnitud creciente.
Por ejemplo, order(c(10,20,30))
dará 1,2,3 y
order(c(30,20,10))
dará a 3,2,1 .