代码之家  ›  专栏  ›  技术社区  ›  tjebo

基于第二列顺序的列密集排序

  •  1
  • tjebo  · 技术社区  · 7 年前

    data.table::frank val (以我为例)

    我设法获得了高密度的排名 @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
    

    但我希望因子水平是根据 . 期望输出:

    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
    
    • 我试过了
    • 我试着定下了比赛的顺序 id 使用 id[rank(val)] (及 sort(val) order(val) ).
    • rank(val) 等等,但这会抛出一个错误( Evaluation error: factor level [3] is duplicated.

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

    我需要它是为了方便,为了生成一个具有特定顺序的表,而不是为了计算。

    于2018年12月19日由 reprex package

    2 回复  |  直到 7 年前
        1
  •  3
  •   BENY    7 年前

    你可以跟我核对一下 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
    
        2
  •  2
  •   Ronak Shah    7 年前

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

    你可以用 match 得到 id_fac id s

    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