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

dplyr相当于sql row_number()(按组划分,按值排序)

  •  0
  • piptoma  · 技术社区  · 5 年前

    初始情况

    我有一个以下形式的数据集:

    library(dplyr)
    
    dat <- tribble(
      ~name, ~iq,
      "ben",  100,
      "alex",  98,
      "mia",  110,
      "paco", 124,
      "mia",  112,
      "mia",  120,
      "paco", 112,
      "ben",   90,
      "alex", 107
    )
    

    我想创建一个新的列,按 name ,价值观 iq 按降序排列。在SQL中可以编写

    select
      name,
      iq,
      row_number() over (partition by name order by iq desc) as rank
    from
      dat;
    

    这将产生以下预期输出(为了简单起见已订购):

    #>   name     iq  rank
    #>   <chr> <dbl> <int>
    #> 1 alex    107     1
    #> 2 alex     98     2
    #> 3 ben     100     1
    #> 4 ben      90     2
    #> 5 mia     120     1
    #> 6 mia     112     2
    #> 7 mia     110     3
    #> 8 paco    124     1
    #> 9 paco    112     2
    

    问题

    有了我的数据,人们可以通过以下方式实现预期的结果:

    dat %>%
      group_by(name) %>%
      mutate(rank = with_order(order_by = iq,
                               fun      = row_number, 
                               x        = desc(iq)
                               )
             ) %>% 
      arrange(name, rank)
    
    #> # A tibble: 9 x 3
    #> # Groups:   name [4]
    #>   name     iq  rank
    #>   <chr> <dbl> <int>
    #> 1 alex    107     1
    #> 2 alex     98     2
    #> 3 ben     100     1
    #> 4 ben      90     2
    #> 5 mia     120     1
    #> 6 mia     112     2
    #> 7 mia     110     3
    #> 8 paco    124     1
    #> 9 paco    112     2
    

    然而,我不明白 为什么? 代码是有效的。在阅读 documentation 属于 dplyr::with_order() ,它说论点是

    • order_by =要排序的向量
    • fun =窗口功能
    • x, ... =支持 f

    鉴于文档中的描述和工作代码,我有两个问题无法回答:

    1. 争论的目的是什么 x ? 为什么不直接指定要排序的向量和窗口函数(比如在sql中)?这是什么意思 F ?
    2. 为什么我不用写呢 order_by = desc(iq) x = desc(iq) 设定 order_by = iq .这似乎与文件相矛盾,文件中说 订购 =要排序的向量。
    0 回复  |  直到 5 年前