Ответ 1
У Хэдли была крутая беседа о его новых пакетах dplyr и ggvis в user2013. Но он, вероятно, может лучше рассказать об этом сам.
Я не уверен, как выглядит ваш дизайн приложения, но я часто делаю предварительную обработку базы данных перед подачей данных в R. Например, если вы планируете временные ряды, нет необходимости показывать каждый второй день на оси X. Вместо этого вы можете захотеть агрегировать и получить значение min/max/mean, например. один или пять минут.
Ниже приведен пример функции, которую я написал много лет назад, что в SQL-стиле что-то подобное. В этом конкретном примере используется оператор modulo, поскольку время хранилось как epoch millis. Но если данные в SQL правильно сохраняются как структуры даты/даты, SQL имеет несколько более элегантных собственных методов для агрегирования по периодам времени.
#' @param table name of the table
#' @param start start time/date
#' @param end end time/date
#' @param aggregate one of "days", "hours", "mins" or "weeks"
#' @param group grouping variable
#' @param column name of the target column (y axis)
#' @export
minmaxdata <- function(table, start, end, aggregate=c("days", "hours", "mins", "weeks"), group=1, column){
#dates
start <- round(unclass(as.POSIXct(start))*1000);
end <- round(unclass(as.POSIXct(end))*1000);
#must aggregate
aggregate <- match.arg(aggregate);
#calcluate modulus
mod <- switch(aggregate,
"mins" = 1000*60,
"hours" = 1000*60*60,
"days" = 1000*60*60*24,
"weeks" = 1000*60*60*24*7,
stop("invalid aggregate value")
);
#we need to add the time differene between gmt and pst to make modulo work
delta <- 1000 * 60 * 60 * (24 - unclass(as.POSIXct(format(Sys.time(), tz="GMT")) - Sys.time()));
#form query
query <- paste("SELECT", group, "AS grouping, AVG(", column, ") AS yavg, MAX(", column, ") AS ymax, MIN(", column, ") AS ymin, ((CMilliseconds_g +", delta, ") DIV", mod, ") AS timediv FROM", table, "WHERE CMilliseconds_g BETWEEN", start, "AND", end, "GROUP BY", group, ", timediv;")
mydata <- getquery(query);
#data
mydata$time <- structure(mod*mydata[["timediv"]]/1000 - delta/1000, class=c("POSIXct", "POSIXt"));
mydata$grouping <- as.factor(mydata$grouping)
#round timestamps
if(aggregate %in% c("mins", "hours")){
mydata$time <- round(mydata$time, aggregate)
} else {
mydata$time <- as.Date(mydata$time);
}
#return
return(mydata)
}