Entendendo a function order ()

Eu estou tentando entender como funciona a function order() . Fiquei com a impressão de que ele retornava uma permutação de índices, que, quando classificados, classificavam o vetor original.

Por exemplo,

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

Eu teria esperado que isso retornasse c(2, 3, 1, 4) , já que a lista classificada seria 10 45 50 96.

Alguém pode me ajudar a entender o valor de retorno dessa function?

Isso parece explicar isso.

A definição de order é que a[order(a)] está em ordem crescente. Isso funciona com o seu exemplo, em que a ordem correta é o quarto, segundo, primeiro e terceiro elemento.

Você pode estar procurando por rank , que retorna o rank dos 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
então rank informa a ordem em que os números estão, a order informa como obtê-los em ordem crescente.

plot(a, rank(a)/length(a)) dará um gráfico do CDF. Para ver por que a order é útil, tente o plot(a, rank(a)/length(a),type="S") que gera uma confusão, porque os dados não estão em ordem crescente

Se você fez
oo< -order(a)
plot(a[oo],rank(a[oo])/length(a),type="S")
ou simplesmente
oo< -order(a)
plot(a[oo],(1:length(a))/length(a)),type="S")
você obtém um gráfico de linhas do CDF.

Aposto que você está pensando em rank.

Para classificar um vetor 1D ou uma única coluna de dados, basta chamar a function sort e passar sua sequência.

Por outro lado, a function de ordem é necessária para classificar os dados bidimensionais de dados – ou seja, várias colunas de dados coletados em uma matriz ou 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 

Aqui está um trecho de dados para tentativas de campo na temporada 2008 da NFL, um dataframe que eu chamei de ‘fg’. suponha que esses 10 pontos de dados representem todos os objectives de campo tentados em 2008; suponha ainda que você queira saber a distância do maior field goal tentado naquele ano, quem o chutou e se foi bom ou não; você também quer saber o segundo mais longo, assim como o terceiro mais longo, etc .; e, finalmente, você quer a menor tentativa de gol de campo.

Bem, você poderia fazer isso:

 sort(fg$Dist, decreasing=T) 

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

Isso está correto, mas não é muito útil – diz-nos a distância da tentativa mais longa de gol de campo, a segunda mais longa, … bem como a mais curta; no entanto, mas isso é tudo que sabemos – por exemplo, não sabemos quem foi o kicker, se a tentativa foi bem sucedida, etc. Claro, precisamos que o dataframe inteiro seja classificado na coluna “Dist” (em outras palavras, deseja classificar todas as linhas de dados no único atributo Dist . que se pareceria com isto:

 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 

Isto é o que a ordem faz. É ‘tipo’ para dados bidimensionais; Em outras palavras, ele retorna um índice inteiro de 1D composto pelos números das linhas, de modo que ordenar as linhas de acordo com aquele vetor, daria a você uma ordenação orientada à linha correta na coluna, Dist

Veja como isso funciona. Acima, a sorting foi usada para classificar a coluna Dist. Para ordenar todo o dataframe na coluna Dist, usamos ‘order’ exatamente da mesma maneira que ‘sort’ é usado acima :

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

(Eu costumo ligar a matriz retornada de ‘ordem’ para a variável ‘ndx’, que significa ‘index’, porque eu vou usá-lo como uma matriz de índice para classificar.)

que foi o passo 1, aqui está o passo 2:

‘ndx’, o que é retornado por ‘sort’ é então usado como uma matriz de índice para reordenar o dataframe, ‘fg’:

 fg_sorted = fg[ndx,] 

fg_sorted é o dataframe reordenado imediatamente acima.

Em suma, ‘sort’ é usado para criar uma matriz de índice (que especifica a ordem de sorting da coluna que você deseja ordenar), que então é usada como uma matriz de índice para reordenar o dataframe (ou matriz).

(Eu achei que seria útil expor as idéias muito simplesmente aqui para resumir o bom material postado por @doug, e linkado por @duffymo; +1 para cada, btw.)

A ordem informa qual elemento do vetor original precisa ser colocado primeiro, segundo, etc., para ordenar o vetor original, enquanto rank indica qual elemento possui o valor mais baixo, o segundo menor, etc. Por exemplo:

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

Então a order(a) está dizendo, ‘coloque o terceiro elemento primeiro quando você ordenar …’, enquanto o rank(a) está dizendo ‘o primeiro elemento é o segundo mais baixo …’. (Note que ambos concordam em qual elemento é mais baixo, etc; eles apenas apresentam as informações de forma diferente.) Assim, vemos que podemos usar order() para classificar, mas não podemos usar rank() dessa forma:

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

Em geral, order() não será igual a rank() menos que o vetor já tenha sido classificado:

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

Além disso, como order() está (essencialmente) operando sobre os ranks dos dados, você poderia compô-los sem afetar as informações, mas o inverso produz bobagens:

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

A execução desse pequeno código me permitiu entender a function do pedido

 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 

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

Isso pode ajudá-lo em algum momento.

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

O que você recebe é

 [1] 10 45 50 96 

O código que escrevi indica que você quer "a" como um subconjunto inteiro de "a" e quer que ele seja ordenado do valor mais baixo para o mais alto.

Em palavras simples, order() fornece as localizações de elementos de magnitude crescente.

Por exemplo, order(c(10,20,30)) dará 1,2,3 e order(c(30,20,10)) dará 3,2,1 .