R группировка нескольких столбцов по

У меня есть набор данных x_output, который выглядит так:

          timestamp   city wait_time weekday
2015-07-14 09:00:00 Boston       1.4 Tuesday
2015-07-14 09:01:00 Boston       2.5 Tuesday
2015-07-14 09:02:00 Boston       2.8 Tuesday
2015-07-14 09:03:00 Boston       1.6 Tuesday
2015-07-14 09:04:00 Boston       1.5 Tuesday
2015-07-14 09:05:00 Boston       1.4 Wednesday

Я хотел бы найти среднее wait_time, сгруппированное по city, weekday и time. В принципе, учитывая ваш город, каково среднее время ожидания, например, в понедельник? Тогда вторник?

У меня возникли трудности с созданием столбца time с учетом x_output$timestamp; В настоящее время я использую:

x_output$time <- strsplit(as.character(x_output$timestamp), split = " ")[[1]][2]

Однако это просто помещает «09:00» в каждую строку, а не правильное время для каждой отдельной строки.

Во-вторых, мне нужно иметь трехстороннюю группировку, чтобы найти среднее время ожидания с учетом города, дня недели и времени. Это то, что довольно просто сделать в python pandas, но я могу найти очень мало документации по этому вопросу в R (и, к сожалению, мне нужно сделать это в R, а не в python).

Я пытался использовать data.table, но это не сработало. Есть ли простая функция, как в python pandas (например, df.groupby(['col1', 'col2', 'col3']).mean())?


person Alex Petralia    schedule 16.07.2015    source источник
comment
Что-то вроде df %>% group_by(city, weekday) %>% mutate(MeaD = mean(wait_time)) с dplyr, но, пожалуйста, напишите полезный код. Ваш код имеет только NAs времени ожидания и только один город и только один день. С этой датой помочь вам невозможно.   -  person SabDeM    schedule 16.07.2015
comment
Извини за это! Исправлено сейчас. Я проверю это в ближайшее время.   -  person Alex Petralia    schedule 16.07.2015
comment
Должно быть больше похоже на sapply(strsplit(as.character(x_output$timestamp), split = " "),'[',2) для извлечения второго элемента из каждого вектора в списке.   -  person MrFlick    schedule 16.07.2015
comment
По каким критериям группировать по timestamp? ежедневно? каждые 12 часов? каждую неделю?   -  person SabDeM    schedule 16.07.2015
comment
Еще одна вещь: вы спрашиваете 3 вещи (немного не связанные), а заголовок касается только группировки данных. Возможно, вам лучше открыть другой вопрос (или выполнить поиск) о том, как анализировать столбец timestamp как дату и время.   -  person SabDeM    schedule 16.07.2015


Ответы (1)


Среднее значение wait_time по городам, дням недели и времени:

library(plyr)
ddply(x_output, .(city, weekday, time), summarize, avg=mean(wait_time))

Если вы хотели data.table

x_output[, list(avg=mean(wait_time)), .(city, weekday, time)]

У меня возникли трудности с созданием столбца time с учетом x_output$timestamp

Итак, что должно быть в столбце time? Просто временная составляющая timestamp? Является ли timestamp POSIXct или строкой?

Если это POSIXct, то вы можете просто преобразовать в символ, указав формат времени:

x_output$time <- as.character(x_output$timestamp, '%H:%M')
# or as.factor(as.character(...)) if you need it to be a factor.
# in data.table: x[, time:=as.character(timestamp, '%H:%M')]

Это сделает столбец time строкой с часами и минутами. См. ?strptime для получения дополнительной информации о преобразовании этой даты и времени в строку (например, если вы хотите включить секунды).

Если это строка, вы можете использовать strsplit и извлечь второй компонент:

vapply(strsplit(x_output$timestamp, ' '), '[', i=2, 'template')

который даст вам «ЧЧ: ММ: СС» в качестве формата времени. Если вы хотите сделать собственный формат времени, вероятно, лучше всего преобразовать вашу строку timestamp в POSIXct и вернуться к определенному формату, как уже упоминалось.

person mathematical.coffee    schedule 16.07.2015
comment
Временная метка -> время работало отлично. Я попробовал оба метода для множественной группы. Используя ddplyr, я получил Error in attributes(out) <- attributes(col) : 'names' attribute [11] must be the same length as the vector [1]. Используя data.table, я получил Error in drop && !has.j : invalid 'x' type in 'x && y'. Мои colclasses (POSIXlt, фактор, числовой, символ, символ). - person Alex Petralia; 16.07.2015
comment
В этом случае вы должны предоставить воспроизводимый пример. Данные, которые вы предоставили в своем вопросе, отлично работают с кодом, который я предоставил, но имеют только одну запись для каждого города и времени. - person mathematical.coffee; 16.07.2015
comment
Я чувствую себя немного сомнительно из-за случайного подключения к загадочному IP-адресу с моего рабочего компьютера (я все равно пытался, и время ожидания истекло - вероятно, брандмауэр). В любом случае проблема, по-видимому, связана с вашими конкретными данными, поэтому вам придется сузить круг, если там что-то искажено. - person mathematical.coffee; 16.07.2015
comment
Хорошо, я посмотрю на это в ближайшее время или опубликую .csv в другом месте, если не смогу заставить его работать. - person Alex Petralia; 16.07.2015
comment
Пока я пытаюсь понять это, вот набор данных и код на данный момент: github.com/alexpetralia/RMV_wait_times - person Alex Petralia; 16.07.2015
comment
В вашем wait_times.csv нет данных в формате вашего вопроса, и у меня нет времени копаться в вашем блестящем коде, чтобы попытаться вытащить биты, которые реконструируют его. Пожалуйста, приведите воспроизводимый пример. - person mathematical.coffee; 17.07.2015
comment
См. также заголовок stackoverflow.com/questions/14153092/ - похоже, ваша временная метка POSIXlt. Вместо этого сделайте POSIXct. - person mathematical.coffee; 17.07.2015
comment
Это сработало. У меня есть последний вопрос, для которого я открою новый вопрос. Большое спасибо за вашу помощь. - person Alex Petralia; 17.07.2015