[R-es] Conversión de objeto temporal (TS) a matriz (o data.frame)

Oscar Perpiñán Lamigueiro oscar.perpinan en gmail.com
Lun Jun 3 01:23:39 CEST 2013


Hola,

Si no te entiendo mal, necesitas la conversión a matriz como paso
intermedio para agregar por meses (o cualquier unidad temporal). Si es
así, te aconsejo que uses el paquete zoo y el método aggregate para la
clase zoo.

Por ejemplo:

library(zoo)
dats <- data.frame(date=seq(as.Date('2012-01-01'), by='day', length=3*365),
                        A=rnorm(3*365), B=rnorm(3*365), C=rnorm(3*365))

z <- zoo(dats[,-1], dats$date)

Zyearmon <- aggregate(z, by=as.yearmon)

month <- function(x) as.numeric(format(x, "%m"))
year <- function(x) as.numeric(format(x, "%Y"))

Zmon <- aggregate(z, by=month)
Zyear <- aggregate(z, by=year)

Saludos.

Oscar

> -----Original Message----- 
> From: Rubén Gómez Antolí
> Sent: Sunday, June 02, 2013 5:10 PM
> To: r-help-es
> Subject: [R-es] Conversión de objeto temporal (TS) a matriz (o data.frame)
>
> Hola a todos:
>
> La pregunta ha quedado clara en el asunto, pero: ¿existe alguna función
> que convierta un objeto temporal (TS) a matriz o data.frame?
>
> En algunos cálculos que estoy haciendo me viene bien convertir un objeto
> temporal a matriz para poder hacer cálculos parciales por meses o años
> (aplicando apply en la matriz) pero no he encontrado ninguna función que
> haga la conversión.
>
> He «fabricado» una para el caso de frecuencia de datos mensual pero se
> me ha dado el caso de un objeto con frecuencia anual y ya me he empeñado
> en hacer la función «de carácter general» y... la cosa se complica bastante.
>
> Si alguien conoce algo estupendo, en caso contrario seguiré con mi función.
>
> Gracias por vuestra atención y por las posibles respuestas.
>
> Salud y Revolución.
>
> Lobo.
>
> Pd: Por si alguien esta interesado, a continuación pongo el código para
> la conversión de una serie mensual.
>
> ts.a.matriz<-function(x) {
>    # Función que convierte un objeto temporal (TS)
>    # en una matriz. Añade NA a los meses que faltan.
>    if ( !is.ts(x) )
>      stop("x tiene que ser un objeto temporal")
>
>    require(TSA)
>    tiempo<-time(x)
>    #meses<-season(x)
>    x.matriz<-matrix(c(
>      #c(rep(NA,which(meses[1] == levels(meses))-1)),
>      c(rep(NA,
>        (tiempo[1]-floor(tiempo[1]))*12-1
>        )
>      ),
>      x,
>      #c(
>      #  rep(NA,
>      # (12- which(meses[length(meses)] == levels(meses)))
>      #  )
>      #)
>      c(rep(NA,(12-
>        (tiempo[length(tiempo)]-floor(tiempo[length(tiempo)]))*12
>        ))
>      )
>      ),
>      byrow=T,ncol=12,
>      dimnames=list(
>        c(floor(tiempo[1]):floor(tiempo[length(tiempo)])),
>        c(format(ISOdate(2013,1:12,1),"%b"))
>      )
>    )
>    return(x.matriz)
> }
>
> Pd2: Por cierto, ¿hay alguna forma de que ISOdate ponga la primera letra
> de los nombres de los meses en mayúscula?


-- 
Oscar Perpiñán Lamigueiro
Grupo de Sistemas Fotovoltaicos (IES-UPM)
Dpto. Ingeniería Eléctrica (EUITI-UPM)
URL: http://procomun.wordpress.com
Twitter: @oscarperpinan



Más información sobre la lista de distribución R-help-es