新手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
如此接近,但到目前为止......
答案 0 :(得分: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
答案 1 :(得分: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