Solución:
Creo el conjunto de datos por
data <- read.table( text=" Date Hour Melbourne Southern Flagstaff
1 2009-05-01 0 0 5 17
2 2009-05-01 2 0 2 1
3 2009-05-01 1 0 11 0
4 2009-05-01 3 0 3 8
5 2009-05-01 4 0 1 0
6 2009-05-01 5 0 49 79
7 2009-05-01 6 0 425 610",
header=TRUE,stringsAsFactors=FALSE)
Puedes hacer la suma con la función aggregate
:
byday <- aggregate(cbind(Melbourne,Southern,Flagstaff)~Date,
data=data,FUN=sum)
library(lubridate)
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month(Date),
data=data,FUN=sum)
Mirar ?aggregate
para comprender mejor la función. Comenzando con el último argumento (porque eso facilita la explicación), los argumentos hacen lo siguiente:
-
FUN
es la función que debe usarse para la agregación. yo suelosum
para resumir los valores, pero también podría sermean
,max
o alguna función que escribiste tú mismo. -
data
se usa para indicar el marco de datos que quiero agregar. - El primer argumento le dice a la función qué es exactamente lo que quiero agregar. En el lado izquierdo del
~
, Indico las variables que quiero agregar. Si hay más de uno, se combinan concbind
. En el lado derecho está la variable por la cual se deben dividir los datos. PoniendoDate
significa que el agregado sumará las variables para cada valor distinto deDate
.
Para la agregación por mes, utilicé la función month
del paquete lubridate
. Hace lo que uno espera: devuelve un valor numérico que indica el mes para una fecha determinada. Tal vez primero necesite instalar el paquete por install.packages("lubridate")
.
Si prefiere no usar lubridate, puede hacer lo siguiente en su lugar:
data <- transform(data,month=as.numeric(format(as.Date(Date),"%m")))
bymonth <- aggregate(cbind(Melbourne,Southern,Flagstaff)~month,
data=data,FUN=sum)
Aquí agregué una nueva columna a los datos que contienen el mes y luego los agregué por esa columna.
Esta podría ser otra forma de hacerlo usando data.table
library(data.table)
# Edited as per Arun's comment
out = setDT(data)[, lapply(.SD, sum), by=Date]
#>out
# Date Hour Melbourne Southern Flagstaff
#1: 2009-05-01 21 0 496 715
o usando dplyr
library(dplyr)
out = data %>% group_by(Date) %>% summarise_each(funs(sum))
#>out
#Source: local data frame [1 x 5]
# Date Hour Melbourne Southern Flagstaff
#1 2009-05-01 21 0 496 715
Otra solución de base R
# to sum by date
rowsum(dat[-1], dat$Date)
# Hour Melbourne Southern Flagstaff
#2009-05-01 21 0 496 715
# or by month and year
rowsum(dat[-1], format(dat$Date, "%b-%y") )
# Hour Melbourne Southern Flagstaff
#May-09 21 0 496 715
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)