Oscar Perpiñán Lamigueiro
2013-Jun-02 23:23 UTC
[R-es] Conversión de objeto temporal (TS) a matriz (o data.frame)
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
Rubén Gómez Antolí
2013-Jun-04 00:35 UTC
[R-es] Conversión de objeto temporal (TS) a matriz (o data.frame)
Hola: Ante todo, gracias por las respuestas. El 03/06/13 01:23, Oscar Perpiñán Lamigueiro escribió:> > Hola, > > Si no te entiendo mal, necesitas la conversión a matriz como paso > intermedio para agregar por meses (o cualquier unidad temporal).¡Hum! No estoy seguro de que agregar sea lo que quiero hacer.> 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)Posiblemente sea por desconocimiento de la clase zoo pero... no veo el camino para realizar las distintas operaciones que estoy realizando, por ejemplo: # Creación de la matriz de salida. matriz.salida<-data.frame( ndatos= apply(x.matriz,2,function(x) length(which(!is.na(x)))), vminimo= formatC( apply(x.matriz,2,function(x) min(x,na.rm=T)), dig=2,format="f"), vmax=formatC( apply(x.matriz,2,function(x) max(x,na.rm=T)), dig=2,format="f"), media=formatC( apply(x.matriz,2,function(x) mean(x,na.rm=T)), dig=2,format="f"), mediana=formatC( apply(x.matriz,2,function(x) median(x,na.rm=T)), dig=2,format="f"), desvtip=formatC( apply(x.matriz,2,function(x) sd(x,na.rm=T)), dig=2,format="f"), varianza=formatC( apply(x.matriz,2,function(x) var(x,na.rm=T)), dig=2,format="f"), shapiro.valor=formatC( aux.shapiro[1,],dig=4,format="f"), shapiro.valp=formatC( aux.shapiro[2,],dig=4,format="f") ) Siendo x.matriz un objeto TS convertido a matriz. Aux.shapiro la calculo así: # Prueba de Shapiro y Wilk aux.shapiro<-matrix(unlist(apply(x.matriz,2,function(x) shapiro.test(x)[1:2])), ncol=12,nrow=2) ¡Ah, vale!: aggregate(z,by=month,FUN=shapiro.test) (Aunque esto me fuerza a tirar a la basura la función que había construido -con mi buen rato que me había llevado- y hacerla de nuevo) Última pregunta, con un objeto ts es muy fácil llevarlo a un documento como una tabla: xtable(objeto.ts), ¿y con un objeto zoo? (Estoy buscando y nada) Y otra, ¿convertir objetos ts a zoo y viceversa? Estoy probando con as.ts() y agua también, pongo unos datos de ejemplo que los que has puesto son en exceso numerosos: lere<-data.frame(date=seq(as.Date("2013-01-01"),by="month",length=3*12),A=rnorm(3*12)) lara<-zoo(lere[,-1],lere$date) as.ts(lara) El resultado no es ni remotamente parecido a lo que debería salir.> Saludos. > > OscarGracias por todo. Salud y Revolución. Lobo. Pd: Acabo de encontrar como resolver el tema de xtable: xtable(aggregate(lara,as.yearmon)) Lo curioso es que xtable convierte el nombre de los meses del perfecto español en que lo muestra aggregate a la lengua de la pérfida Albión. Habrá que pelear con eso. -- Libertad es poder elegir en cualquier momento. Ahora yo elijo GNU/Linux, para no atar mis manos con las cadenas del soft propietario. Porque la libertad no es tu derecho, es tu responsabilidad. http://www.mucharuina.com --------- Desde El Ejido, en Almería, usuario registrado Linux #294013 http://www.counter.li.org
Oscar Perpiñán Lamigueiro
2013-Jun-04 15:48 UTC
[R-es] Conversión de objeto temporal (TS) a matriz (o data.frame)
> Última pregunta, con un objeto ts es muy fácil llevarlo a un documento > como una tabla: xtable(objeto.ts), ¿y con un objeto zoo? (Estoy buscando > y nada) > > Y otra, ¿convertir objetos ts a zoo y viceversa? Estoy probando con > as.ts() y agua también, pongo unos datos de ejemplo que los que has > puesto son en exceso numerosos:Hola, En mi opinión, zoo cuenta con una documentación excelente. Si te decides a utilizarlo (algo que te recomiendo) te serán útiles sus vignettes, especialmente la Quick Reference, la "Reading Data" y, por supuesto, las FAQs. Saludos. Oscar. -- Oscar Perpiñán Lamigueiro Grupo de Sistemas Fotovoltaicos (IES-UPM) Dpto. Ingeniería Eléctrica (EUITI-UPM) URL: http://procomun.wordpress.com Twitter: @oscarperpinan