Вот решение, использующее пакет plyr
для анализа данных и пакет ggplot2
для графика:
Считайте данные. Обратите внимание на использование stringsAsFactors=FALSE
- это сэкономит массу хлопот, конвертируя в as.character
позже:
df <- read.csv(textConnection('
"SOURCE","REQUEST_DATE"
"A","09/11/2011 09:28:48"
"A","09/11/2011 09:21:15"
"A","09/11/2011 09:15:42"
"A","09/11/2011 09:12:18"
"D","09/13/2011 09:06:53"
"D","09/13/2011 09:06:18"
"D","09/13/2011 08:56:55"
"D","09/13/2011 08:56:18"
"D","09/13/2011 08:55:43"
"D","09/13/2011 08:39:07"
'), stringsAsFactors=FALSE)
Конвертировать в формат даты POSIX:
df$REQUEST_DATE <- as.POSIXct(df$REQUEST_DATE, format="%m/%d/%Y %H:%M:%S")
Загрузка plyr
и использование ddply
для a) группировки по SOURCE, b) вычисления difftime, c) группировки результатов в data.frame, все за один шаг:
library(plyr)
df_diff <- ddply(df, .(SOURCE), summarize, TIME_DIFF=-unclass(diff(REQUEST_DATE)))
df_diff
SOURCE TIME_DIFF
1 A 7.55
2 A 5.55
3 A 3.40
4 D 35.00
5 D 563.00
6 D 37.00
7 D 35.00
8 D 996.00
Загрузка ggplot2
и сюжет. Сюжет выглядит немного мусором - это потому, что набор данных образца крошечный. Это будет работать лучше с большими наборами данных, то есть вы получите четкое разделение между медианой, диапазоном и выбросами.
library(ggplot2)
ggplot(df_diff, aes(y=TIME_DIFF, x=SOURCE)) + geom_boxplot()