Rubén Gómez Antolí
2013-Jun-02 20:10 UTC
[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? -- 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
Marcuzzi, Javier Rubén
2013-Jun-02 22:51 UTC
[R-es] Conversión de objeto temporal (TS) a matriz (o data.frame)
Estimado Rubén Gómez Antolí En mi caso en particular al trabajar con fechas, me encontré con inconvenientes, algunos de ellos fueron mejorados en R, hoy estoy desactualizado, pero creo que en el siguiente lugar http://cran.r-project.org/web/views/TimeSeries.html hay referencia actualizada, esperando que en esta encuentre lo que necesite lo saludo muy atentamente. Javier Marcuzzi -----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? -- 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 _______________________________________________ R-help-es mailing list R-help-es en r-project.org https://stat.ethz.ch/mailman/listinfo/r-help-es
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