dplyr 相当于 sql row_number() over(按值按组顺序分区)

pip*_*oma 6 r window-functions dplyr

初始情况

我有以下形式的数据集:

library(dplyr)

dat <- tribble(
  ~name, ~iq,
  "ben",  100,
  "alex",  98,
  "mia",  110,
  "paco", 124,
  "mia",  112,
  "mia",  120,
  "paco", 112,
  "ben",   90,
  "alex", 107
)
Run Code Online (Sandbox Code Playgroud)

我想创建一个新列,按降序name对值iq进行排序和分组。在 SQL 中可以写

select
  name,
  iq,
  row_number() over (partition by name order by iq desc) as rank
from
  dat;
Run Code Online (Sandbox Code Playgroud)

这将产生以下预期输出(为简单起见已排序):

library(dplyr)

dat <- tribble(
  ~name, ~iq,
  "ben",  100,
  "alex",  98,
  "mia",  110,
  "paco", 124,
  "mia",  112,
  "mia",  120,
  "paco", 112,
  "ben",   90,
  "alex", 107
)
Run Code Online (Sandbox Code Playgroud)

问题

使用我的数据,可以通过以下方式获得所需的结果:

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
Run Code Online (Sandbox Code Playgroud)

但是,我不明白为什么代码有效。在阅读 的文档dplyr::with_order(),它说参数是

  • order_by = 要排序的向量
  • fun = 窗函数
  • x, ... = 论据 f

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

  1. 争论的目的是x什么?为什么不指定要排序的向量和窗口函数(如在 sql 中)?是什么意思f
  2. 为什么我不用写order_by = desc(iq)?为了得到我期望的结果,我必须编写x = desc(iq)和设置order_by = iq. 这似乎与文档相矛盾,该文档指出order_by= 要排序的向量。