2014-09-29 138 views
21

假設我有以下數據用dplyr創建一個排名變量?

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

我想與排名添加新列。這是我在做什麼:

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 

然而,我期望的結果是:

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

顯然rank沒有做什麼,我都記在心裏。我應該使用什麼功能?

+5

你期待'DF%>%變異(等級= DENSE_RANK(-score))'? – A5C1D2H2I1M1N2O1R2T1 2014-09-29 18:33:15

+0

是的!非常感謝! :-) – Ignacio 2014-09-29 18:36:44

回答

36

聽起來好像您正在尋找來自「dplyr」的dense_rank - 但以與rank通常相反的順序應用。當你需要的等級適用於所有變量(而不僅僅是一個)

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

即使'-score'工作正常,希望使用'desc(score)'。哈德利戳了我一次cpl次。 – hrbrmstr 2014-09-29 18:45:58

+0

@hrbrmstr,是啊 - 編輯.... – A5C1D2H2I1M1N2O1R2T1 2014-09-29 18:48:04

+0

有可能有C的排名爲3和D 4? – Ignacio 2014-09-29 19:00:40

2

其他解決方案:

試試這個。

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'有'desc()',你不需要'inv_d'。 (這很好,因爲它適用於很多數據類型,而不僅僅是數字)。你也不需要單獨做這個,你可以一次全部完成:'mutate_all(df,funs(dense_rank(desc(。)) ))' – Gregor 2017-02-21 21:28:59

+0

謝謝Gregor,我更新了答案。 – 2017-02-22 03:02:48