Подтвердить что ты не робот

Dplyr не группирует данные по дате

Я пытаюсь рассчитать частоту байков, которые принимают люди, использующие набор данных, предоставленный Leada.

Вот код:

library(dplyr)

setAs("character", "POSIXlt", function(from) strptime(from, format = "%m/%d/%y %H:%M"))
d <- read.csv("http://mandrillapp.com/track/click/30315607/s3-us-west-1.amazonaws.com?p=eyJzIjoiemxlVjNUREczQ2l5UFVPeEFCalNUdmlDYTgwIiwidiI6MSwicCI6IntcInVcIjozMDMxNTYwNyxcInZcIjoxLFwidXJsXCI6XCJodHRwczpcXFwvXFxcL3MzLXVzLXdlc3QtMS5hbWF6b25hd3MuY29tXFxcL2RhdGF5ZWFyXFxcL2Jpa2VfdHJpcF9kYXRhLmNzdlwiLFwiaWRcIjpcImEyODNiNjMzOWJkOTQxMGM5ZjlkYzE0MmQ0NDQ5YmU4XCIsXCJ1cmxfaWRzXCI6W1wiMTVlYzMzNWM1NDRlMTM1ZDI0YjAwODE4ZjI5YTdkMmFkZjU2NWQ2MVwiXX0ifQ",
              colClasses = c("numeric", "numeric", "POSIXlt", "factor", "numeric", "POSIXlt", "factor", "numeric", "numeric", "factor", "character"),
              stringsAsFactors = T)
names(d)[9] <- "BikeNo"

d <- tbl_df(d)

d <- d %>% mutate(Weekday = factor(weekdays(Start.Date)))
d %>% group_by(Weekday) 
  %>% summarise(Total = n()) 
  %>% select(Weekday, Total)

Странно, но dplyr не хочет группировать данные по будням, говоря:

Ошибка: столбец "Start.Date" имеет неподдерживаемый тип

Почему он заботится о столбце Start.Date, где я группирую фактор? Вы можете запустить код локально, чтобы воспроизвести ошибку: он автоматически загрузит данные.

P.S. Я использую dplyr версию: dplyr_0.3.0.2

4b9b3361

Ответ 1

Пакет lubridate полезен при работе с датами. Вот код для разбора Start.Date и End.Date, извлечения дней недели, а затем группы по неделям:

Чтение дат как символьных векторов

library(dplyr)
library(lubridate)
# For some reason your instruction to load the csv directly from a url
# didn't work. I save the csv to a temporary directory.
d <- read.csv("/tmp/bike_trip_data.csv", colClasses = c("numeric", "numeric", "character", "factor", "numeric", "character", "factor", "numeric", "numeric", "factor", "character"), stringsAsFactors = T)

names(d)[9] <- "BikeNo"
d <- tbl_df(d)

Использовать lubridate для преобразования даты начала и окончания даты

d <- d %>% 
  mutate(
    Start.Date = parse_date_time(Start.Date,"%m/%d/%y %H:%M"),
    End.Date = parse_date_time(End.Date,"%m/%d/%y %H:%M"),
    Weekday = wday(Start.Date, label=TRUE, abbr=FALSE))

Количество строк в неделю

d %>%
  group_by(Weekday) %>%
  summarise(Total = n())

#     Weekday Total
# 1    Sunday 10587
# 2    Monday 23138
# 3   Tuesday 24678
# 4 Wednesday 23651
# 5  Thursday 25265
# 6    Friday 24283
# 7  Saturday 12413

Ответ 2

Мне очень жаль, что эта проблема давно забыта, но мне кажется странным, что все рекомендуют конвертировать в POSIX.ct или символ, когда я использую гораздо более простое решение вызова функции аранжировки из пакета plyr, используя plyr::arrange, поскольку он не имеет проблем с форматами POSIXlt. Поскольку я, как правило, не самый простой способ решения проблемы в R, я начинаю думать, что с ней что-то не так. Разве это не так, как версия dplyr?