2010-07-07 3 views
7

sto cercando di ordinare questo dataframe per numero di abitanti e la data, quindi sto usando il order() e rank() funzioni:Come posso creare un nuovo ties.method con la funzione R rank()?

> df <- data.frame(idgeoville = c(5, 8, 4, 3, 4, 5, 8, 8), 
        date  = c(rep(1950, 4), rep(2000, 4)), 
        population = c(500, 450, 350, 350, 650, 500, 500, 450)) 
> df 
    idgeoville date population 
1 5   1950  500 
2 8   1950  450 
3 4   1950  350 
4 3   1950  350 
5 4   2000  650 
6 5   2000  500 
7 8   2000  500 
8 8   2000  450 

Con ties.method = "first" non ho alcun problema, finalmente sto producendo questo dataframe:

idgeoville date population rank 
1 5   1950  500  1 
2 8   1950  450  2 
3 4   1950  350  3 
4 3   1950  350  4 
5 4   2000  650  1 
6 5   2000  500  2 
7 8   2000  500  3 
8 8   2000  450  4 

Ma in realtà, voglio un dataframe con uguale classifica a parità di popolazione rango, in questo modo:

idgeoville date population rank 
1 5   1950  500  1 
2 8   1950  450  2 
3 4   1950  350  3 
4 3   1950  350  3 
5 4   2000  650  1 
6 5   2000  500  2 
7 8   2000  500  2 
8 8   2000  450  3 

Come posso risolvere questo problema con R? Con un costume ties.method() o altri trucchi R?

+0

per quanto riguarda i legami = min o max, o media ... tutti tengono le fila delle parità lo stesso valore. – John

+0

Con min e x2 <- c (1,1,2,3), ho 1 1 3 4/ Con max e x2 <- c (1,1,2,3), ho 2 2 3 4 Voglio questo risultato per x2 rank => 1 1 2 3 – reyman64

+0

Oppure usare 'max' e sottrarre il numero di legami dal risultato? '2 2 3 4-1 = 1 1 2 3'. Ora, il problema è capire il numero di cravatte ... Ad ogni modo, mi sono imbattuto in questo thread attraverso Google. – Frank

risposta

4

Credo non ci sia alcuna possibilità di farlo con il grado; qui è una funzione personalizzata che farà ciò che si vuole, ma potrebbe essere troppo lento se i dati è enorme:

Rank<-function(d) { 
    j<-unique(rev(sort(d))); 
    return(sapply(d,function(dd) which(dd==j))); 
} 
+0

Thx molto, va bene! Ma se un'altra persona ha una soluzione migliore e/o più veloce con il pacchetto R, io prendo! – reyman64

1

Questo risponde a una domanda un po 'diversa, vale a dire come ordinare un oggetto data.frame in base a più colonne. Per fare questo, è possibile utilizzare la funzione sort_df nel pacchetto reshape:

> library(reshape) 
> sort_df(df,vars=c('date','population')) 
    idgeoville date population 
3   4 1950  350 
4   3 1950  350 
2   8 1950  450 
1   5 1950  500 
8   8 2000  450 
6   5 2000  500 
7   8 2000  500 
5   4 2000  650 
+0

Questo non risponde alla domanda. Inoltre, 'population' è ordinato in ordine ascendente mentre per la classifica mi aspetterei un ordine discendente (prima il più grande). – Uwe

6

Più modo semplice:

pop.rank <- as.numeric(factor(population)) 
+0

Questo usa solo 'popolazione' e ignora la' data' richiesta dall'OP. Quindi, creerà una classifica generale ma non una classifica separata per ogni 'data'. – Uwe