【问题标题】:Dense ranking of column based on order of second column基于第二列顺序的列密集排序
【发布时间】:2018-12-19 15:30:29
【问题描述】:

我正在为一些可能直截了当的事情绞尽脑汁。我想在数据框中的列上获得“密集”排名(为data.table::frank 函数定义),但不是基于列的正确顺序,顺序应该由另一列给出(val in我的例子)

我设法获得了@Prasad Chalasani 's solution 的密集排名,就像这样:

library(dplyr)
foo_df <- data.frame(id = c(4,1,1,3,3), val = letters[1:5])

foo_df %>% arrange(val) %>% mutate(id_fac = as.integer(factor(id)))
#>   id val id_fac
#> 1  4   a      3
#> 2  1   b      1
#> 3  1   c      1
#> 4  3   d      2
#> 5  3   e      2

但我希望根据val 对因子水平进行排序。期望的输出:

foo_desired <-  foo_df %>% arrange(val) %>% mutate(id_fac = as.integer(factor(id, levels = c(4,1,3))))
foo_desired
#>   id val id_fac
#> 1  4   a      1
#> 2  1   b      2
#> 3  1   c      2
#> 4  3   d      3
#> 5  3   e      3
  • 我试过data.table::frank
  • 我尝试了@Prasad Chalasani 的两种方法。
  • 我尝试使用id[rank(val)](以及sort(val)order(val))设置id的顺序。
  • 最后,我还尝试使用 rank(val) 等对级别进行排序,但这会引发错误 (Evaluation error: factor level [3] is duplicated.)

  • 我知道可以指定级别顺序,我使用它来创建所需的输出。然而,这个解决方案并不是很好,因为我的数据有更多的行和级别

为了方便起见,我需要它来生成具有特定顺序的表,而不是用于计算。

reprex package (v0.2.1) 于 2018 年 12 月 19 日创建

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您可以通过first查看

    foo_df %>% arrange(val) %>% 
              group_by(id)%>%mutate(id_fac = first(val))%>%
              ungroup()%>%
              mutate(id_fac=as.integer(factor(id_fac)))
    # A tibble: 5 x 3
         id    val id_fac
      <dbl> <fctr>  <int>
    1     4      a      1
    2     1      b      2
    3     1      c      2
    4     3      d      3
    5     3      e      3
    

    【讨论】:

    • 这是一个不错的方法。但是,我会更直接地接受@Ronak Shah 的回答。
    【解决方案2】:

    你为什么还需要 factors ?不确定我是否遗漏了某些东西,但这会提供您想要的输出。

    您可以根据ids 的出现,使用match 得到id_fac

    library(dplyr)
    
    foo_df %>%
        mutate(id_fac = match(id, unique(id)))
    
    #  id val id_fac
    #1  4   a      1
    #2  1   b      2
    #3  1   c      2
    #4  3   d      3
    #5  3   e      3
    

    【讨论】:

    • 你说得对,我不需要因素——这只是我获得这个密集排名的方法。非常好的解决方案。谢谢!!
    猜你喜欢
    • 2017-03-16
    • 1970-01-01
    • 2016-07-19
    • 2023-01-09
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多