R:列组更改时的增量排名

时间:2015-05-01 19:13:59

标签: r dataframe rank

新手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 个答案:

答案 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