2015-07-16 4 views
1

У меня есть набор данных x_output который выглядит следующим образом:R несколько столбцов группы по

  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. В принципе, учитывая ваш город, какое среднее время ожидания для понедельника, например? Тогда во вторник?

У меня возникли трудности с созданием колонки timex_output$timestamp; Я в настоящее время использую:

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

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

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

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

+1

Что-то вроде 'df%>% group_by (city, weekday)%>% mutate (MeaD = mean (wait_time))' с 'dplyr', но, пожалуйста, напишите полезный код. Ваш код имеет только 'NA' в ожидании и только один город и только один день. С этой датой вам не поможет. – SabDeM

+0

Жаль об этом! Исправлено. Я проверю это в ближайшее время. –

+0

Должно быть больше похоже на 'sapply (strsplit (as.character (x_output $ timestamp), split = ""), '[', 2) 'для извлечения второго элемента из каждого вектора в списке. – MrFlick

ответ

0

Mean 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') 

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

+0

Временная метка -> время отлично работало. Я попробовал оба метода для нескольких groupby. Используя 'ddplyr', я получил' Ошибка в атрибутах (out) <- attributes (col): Атрибут 'names' [11] должен быть такой же длины, как и вектор [1] '. Используя таблицу data.table, я получил 'Error in drop &&! Has.j: недействительный 'x' тип в 'x && y''. Мои колклассы (POSIXlt, factor, numeric, character, character). –

+0

В этом случае вы должны предоставить воспроизводимый пример. Данные, которые вы предоставили в своем вопросе, отлично работают в коде, который я предоставил, но имеют только одну запись для каждого города и времени. –

+0

Я чувствую себя немного неудобно о случайном подключении к тайному IP-адресу с моего рабочего компьютера (я все-таки пробовал, и он был приурочен - вероятно, брандмауэр). В любом случае проблема, по-видимому, связана с вашими конкретными данными, поэтому вам придется сужаться, если в ней что-то искажено. –

Смежные вопросы