2015-05-01 40 views
1

新手到R,我試過谷歌搜索,但我找不到解決方案。R:當列組發生變化時增加排名

這裏是我的數據幀:

Name   Value 
Bob   50 
Mary   55 
John   51 
Todd   50 
Linda   56 
Tom   55 

所以我排序的,但我需要添加一個排名列,所以它看起來是這樣的:

Name   Value Rank 
Bob   50  1 
Todd   50  1 
John   51  2 
Mary   55  3 
Tom   55  3 
Linda   56  4 

所以,我發現了什麼是:

resultset$Rank <- ave(resultset$Name, resultset$Value, FUN = rank) 

但是這給了我:

Name   Value Rank 
Bob   50  1 
Todd   50  2 
John   51  1 
Mary   55  1 
Tom   55  2 
Linda   56  1 

如此接近,但還沒有那麼遠,

回答

2

這裏的一個基-R溶液:

uv <- unique(df$Value) 
merge(df,data.frame(uv,r=rank(uv)),by.x="Value",by.y="uv") 

其給出

Value Name r 
1 50 Bob 1 
2 50 Todd 1 
3 51 John 2 
4 55 Mary 3 
5 55 Tom 3 
6 56 Linda 4 

這是低效的存儲器,並具有藉助數據的副作用。你可以做交替:

require(data.table) 
DT <- data.table(df) 
DT[order(Value),r:=.GRP,by=Value] 

這給

Name Value r 
1: Bob 50 1 
2: Mary 55 3 
3: John 51 2 
4: Todd 50 1 
5: Linda 56 4 
6: Tom 55 3 
+0

完美。謝謝! –

1

無需排序......可以使用從「dplyr」 dense_rank

> library(dplyr) 
> mydf %>% mutate(rank = dense_rank(Value)) 
    Name Value rank 
1 Bob 50 1 
2 Mary 55 3 
3 John 51 2 
4 Todd 50 1 
5 Linda 56 4 
6 Tom 55 3 
0

我猜你的排名變量可以通過以下方式獲得1:length(unique(df$value))。以下是我的試用版。

df <- data.frame(name = c("Bob", "Mary", "John", "Todd", "Linda", "Tom"), 
       value = c(50, 55, 51, 50, 56, 55)) 
# rank by lengths of unique values 
rank <- data.frame(rank = 1:length(unique(df$value)), value = sort(unique(df$value))) 
merge(df, rank, by="value") 
value name rank 
1 50 Bob 1 
2 50 Todd 1 
3 51 John 2 
4 55 Mary 3 
5 55 Tom 3 
6 56 Linda 4 
+0

'rank'是一個函數,所以你可能不希望重用的名稱。此外,可能會令人困惑的是,與包含它的data.frame具有相同名稱的列。 – Frank

+1

@ Frank - 感謝您的評論。嚴格來說,R只在函數中搜索函數,所以如果我運行'rank(rank $ rank)',它就不會失敗 - 這裏只有第一個函數是rank()。不過,我不否認,指定一個不同的名字是一個好習慣我不認爲給數據框和列名之一分配一個相同的名字會讓人困惑。相反,將不同的名稱分配給我的每一個不同的東西可能會令人困惑。 –

相關問題