Dplyr не учитывает группы при ранжировании данных

#r #dplyr

#r #dplyr

Вопрос:

Используя приведенный ниже код в dplyr 0.7.6, я пытаюсь вычислить ранг переменной для каждого дня в наборе данных. Но dplyr не учитывает group_by(CREATIONDATE_DAY)

 dates <- sample(seq(from=as.POSIXct("2019-03-12",tz="UTC"),to=as.POSIXct("2019-03-20",tz="UTC"),by = "day"),size = 100,replace=TRUE)
group <- sample(c("A","B","C"),100,TRUE)

df <- data.frame(CREATIONDATE_DAY = dates,GROUP = group)
# calculate the occurances for each day and group
dfMod <- df %>% group_by(CREATIONDATE_DAY,GROUP) %>%
                dplyr::summarise(COUNT = n()) %>% ungroup()
# Compute the rank by count for each day
dfMod <- dfMod %>% group_by(CREATIONDATE_DAY) %>%
                   mutate(rank = rank(-COUNT, ties.method ="min"))
 

Но значения ранга вычисляются для всей группы, а не для значения дня создания. Как видно на изображении, строка с идентификатором 24 должна иметь ранг 1, поскольку 4 является наивысшим значением для 16.03.2019, а строка 23 должна иметь ранг 2 этого конкретного дня. В чем моя ошибка?

введите описание изображения здесь

Редактировать: добавлен желаемый результат:

введите описание изображения здесь

Редактировать # 2: как указал MrFlick, я проверил свою версию dplyr (0.7.6) и обновление до самой последней версии устранило проблему для меня.

Комментарии:

1. В вашем примере используются случайно сгенерированные данные. Используйте set.seed() , чтобы мы могли получать одинаковые случайные значения, иначе очень сложно проверить или воспроизвести ваши результаты.

2. Кажется, он отлично работает, глядя на View(dfMod %>% arrange(CREATIONDATE_DAY, -COUNT))

3. @user3394605 Ваш набор данных не отсортирован по CREATIONDATE_DAY , что, вероятно, привело к путанице. Функция ранжирования ранжирует, но не выполняет повторную сортировку. Если вы последуете предложению MrFlick отсортировать строки перед просмотром, вы должны получить то, что хотите.

4. Я вижу пару проблем: (1) вы не привели воспроизводимый пример; (2) неясно, что не так, основываясь на том немногом, что вы нам показали. Когда я запускаю ваш код (с моим собственным случайным запуском) и проверяю ранжирование (используя MrFlick arrange ), оно правильное. Пожалуйста, переделайте свой код после использования set.seed .

5. Какую версию dplyr вы используете? Я тестировал с dplyr_0.8.0.1

Ответ №1:

Кажется, что может быть какой-то конфликт с другим пакетом. Если у вас есть active lubridate , попробуйте изменить порядок, в котором вы вызываете пакеты lubridate и dplyr (я попробовал ваш пример и дал мне правильный ответ). Тем не менее, вы все еще можете попробовать с:

 dfMod <- dfMod %>% group_by(CREATIONDATE_DAY) %>% mutate(rank = row_number(desc(COUNT)))
> head(dfMod)
# A tibble: 6 x 4
# Groups:   CREATIONDATE_DAY [2]
  CREATIONDATE_DAY    GROUP COUNT  rank
  <dttm>              <fct> <int> <int>
1 2019-03-12 00:00:00 A         2     3
2 2019-03-12 00:00:00 B         5     1
3 2019-03-12 00:00:00 C         4     2
4 2019-03-13 00:00:00 A         4     1
5 2019-03-13 00:00:00 B         3     2
6 2019-03-13 00:00:00 C         2     3