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