dplyr эквивалент sql row_number () over (разбиение по группам по значению) - PullRequest
0 голосов
/ 14 февраля 2019

Исходная ситуация

У меня есть набор данных следующей формы:

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() говорится, что аргументы:

  • order_by = вектор для упорядочения по
  • fun = оконная функция
  • x, ... = аргументы для f

Учитывая описание в документации и рабочий код, у меня есть два вопроса, на которые я не могу ответить:

  1. Какова цель аргумента x?Почему бы просто не указать вектор для сортировки по и оконную функцию (как в sql)?Что подразумевается под f?
  2. Почему мне не нужно писать order_by = desc(iq)?Я ожидаю, что для получения результата мне нужно написать x = desc(iq) и установить order_by = iq.Кажется, это противоречит документации, в которой говорится, что order_by = вектор для упорядочения по.
...