#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