Saltar al contenido

Sumar filas por mes en R

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 suelo sum para resumir los valores, pero también podría ser mean, 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 con cbind. En el lado derecho está la variable por la cual se deben dividir los datos. Poniendo Date significa que el agregado sumará las variables para cada valor distinto de Date.

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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *