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?

¿Fue útil?

Solución

Este parece explicarlo.

  

La definición de order es que está en a[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 que rank 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 creciente

     

Si 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 .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top