2014-09-29 2 views
21

Supponiamo che io ho i seguenti datiCreare una variabile di classifica con dplyr?

df = data.frame(name=c("A", "B", "C", "D"), score = c(10, 10, 9, 8)) 

voglio aggiungere una nuova colonna con la classifica. Questo è quello che sto facendo:

df %>% mutate(ranking = rank(score, ties.method = 'first')) 
# name score ranking 
# 1 A 10  3 
# 2 B 10  4 
# 3 C  9  2 
# 4 D  8  1 

Tuttavia, il mio risultato desiderato è:

# name score ranking 
# 1 A 10  1 
# 2 B 10  1 
# 3 C  9  2 
# 4 D  8  3 

Chiaramente rank non fare quello che ho in mente. Quale funzione dovrei usare?

+5

ti aspetti 'df%>% mutare (rango = DENSE_RANK (-score))'? – A5C1D2H2I1M1N2O1R2T1

+0

Sì! Molte grazie! :-) – Ignacio

risposta

36

Sembra che stiate cercando dense_rank da "dplyr" - ma applicato in un ordine inverso rispetto a quello che lo fa normalmente rank.

Prova questo:

df %>% mutate(rank = dense_rank(desc(score))) 
# name score rank 
# 1 A 10 1 
# 2 B 10 1 
# 3 C  9 2 
# 4 D  8 3 
+2

Praticamente vuole usare 'desc (score)' anche se '-score' funziona. Hadley mi ha colpito per un po 'di tempo. – hrbrmstr

+0

@hrbrmstr, sì - modificato .... – A5C1D2H2I1M1N2O1R2T1

+0

E 'possibile avere la classifica di C essere 3 e per D 4? – Ignacio

2

Altro soluzione quando è necessario applicare il rango di tutte le variabili (non solo uno).

df = data.frame(name=c("A","B","C","D"), score=c(10,10,9,8), score2=c(5,1,9,2))

select(df,-name) %>% mutate_all(funs(dense_rank(desc(.))))

+0

'dplyr' ha' desc() ', non è necessario' inv_d'. (È bello perché funziona per molti tipi di dati, non solo numerici.) Inoltre non è necessario farlo in passaggi separati, puoi andare tutto in una volta: 'mutate_all (df, funs (dense_rank (desc (.)))) ' – Gregor

+0

Grazie Gregor, ho aggiornato la risposta. –