2014-09-29 12 views
21

Angenommen, ich habe folgende DatenErstellen Sie eine Ranking-Variable mit dplyr?

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

Ich möchte eine neue Spalte mit der Rangliste hinzuzufügen. Das ist, was ich tue:

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 

jedoch mein gewünschtes Ergebnis ist:

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

Klar rank nicht tun, was ich im Sinne habe. Welche Funktion sollte ich verwenden?

+5

Erwarten Sie 'df%>% mutieren (Rang = DENSE_RANK (-score))'? – A5C1D2H2I1M1N2O1R2T1

+0

Ja! Danke vielmals! :-) – Ignacio

Antwort

36

Es klingt wie Sie suchen nach dense_rank von "dplyr" - aber in umgekehrter Reihenfolge angewendet als was normalerweise rank tut.

Versuchen Sie folgendes:

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

Prbly will 'desc (score)' verwenden, obwohl '-score' funktioniert. Hadley hat mir das mal mal gekillt. – hrbrmstr

+0

@hrbrmstr, yeah - editiert .... – A5C1D2H2I1M1N2O1R2T1

+0

Ist es möglich, die Rangfolge von C 3 und D 4 zu haben? – Ignacio

2

Andere Lösung, wenn Sie den Rang auf alle Variablen anwenden müssen (und nicht nur eins).

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' hat' desc() ', du brauchst nicht' inv_d'. (Es ist schön, weil es für viele Datentypen funktioniert, nicht nur für Zahlen.) Sie müssen dies auch nicht in getrennten Schritten tun, Sie können alle auf einmal gehen: 'mutate_all (df, funs (dose_rank (desc (.)))) ' – Gregor

+0

Danke Gregor, ich habe die Antwort aktualisiert. –

Verwandte Themen