Исходная ситуация
У меня есть набор данных следующей формы:
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
Учитывая описание в документации и рабочий код, у меня есть два вопроса, на которые я не могу ответить:
- Какова цель аргумента
x
?Почему бы просто не указать вектор для сортировки по и оконную функцию (как в sql)?Что подразумевается под f
? - Почему мне не нужно писать
order_by = desc(iq)
?Я ожидаю, что для получения результата мне нужно написать x = desc(iq)
и установить order_by = iq
.Кажется, это противоречит документации, в которой говорится, что order_by
= вектор для упорядочения по.