dplyr等同于sql row_number()以上(按值按组顺序划分)

时间:2019-02-14 16:16:25

标签: r dplyr window-functions

初始情况

我具有以下形式的数据集:

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

但是,我不明白为什么为什么有效。读取dplyr::with_order()的{​​{3}}时,表示参数为

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

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

  1. 自变量x的目的是什么?为什么不只指定要排序的向量和window函数(如sql中)? f是什么意思?
  2. 为什么我不必写order_by = desc(iq)?要获得结果,我希望我必须写x = desc(iq)并设置order_by = iq。这似乎与文档相矛盾,该文档指出order_by =要排序的向量。

0 个答案:

没有答案