【问题标题】:R: Increment Rank when the column group changesR:列组更改时增加Rank
【发布时间】:2015-05-01 19:13:59
【问题描述】:

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

如此接近但又如此遥远......

【问题讨论】:

    标签: r dataframe rank


    【解决方案1】:

    这是一个 base-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
    

    【讨论】:

      【解决方案2】:

      无需排序...您可以使用“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
      

      【讨论】:

        【解决方案3】:

        我猜你的rank变量可以通过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
        

        【讨论】:

        • rank 是一个函数,因此您可能不想重用该名称。此外,拥有与包含它的 data.frame 同名的列可能会造成混淆。
        • @ Frank - 感谢您的评论。严格来说,R 仅在函数中搜索函数,因此如果我运行 rank(rank$rank),它就不会失败 - 这里只有第一个是函数 rank()。但是我不否认分配不同的名称是一个好习惯 |我不认为为数据框分配相同的名称并且其中一个列名令人困惑。相反,为每个不同的事物分配不同的名称可能会让我感到困惑。
        猜你喜欢
        • 2017-07-28
        • 1970-01-01
        • 2019-07-18
        • 1970-01-01
        • 1970-01-01
        • 2015-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多