Está en la página 1de 4

La función reshape(): cambiando la forma de un

dataframe.
En ocasiones es necesario cambiar la “forma” en que los datos se encuentran dispuestos
dentro de un dataframe. A modo de ejemplo, el siguiente archivo contiene los datos de
temperatura en el aeropuerto de Gran Canaria medidos una vez cada hora desde el 1 de enero
de 2014 (nótese que el archivo se descarga de una dirección http)

tempe=read.csv2("http://www.dma.ulpgc.es/profesores/personal/stat/cursoR4
ULPGC/datos/temperatura2014.csv")
head(tempe)
## mes dia temp0 temp1 temp2 temp3 temp4 temp5 temp6 temp7 temp8 temp9
temp10
## 1 1 1 16 16 16 16 15 15 15 15 15 17
19
## 2 1 2 15 15 15 14 14 14 14 14 15 18
18
## 3 1 3 16 16 16 15 15 15 15 16 16 18
19
## 4 1 4 17 17 17 17 17 18 18 18 18 20
21
## 5 1 5 19 19 19 18 18 18 17 17 17 18
20
## 6 1 6 18 17 17 16 15 15 17 17 17 18
19
## temp11 temp12 temp13 temp14 temp15 temp16 temp17 temp18 temp19 temp2
0 temp21
## 1 19 20 19 19 19 19 18 18 17 1
6 16
## 2 19 19 20 19 19 19 19 18 17 1
6 16
## 3 20 20 21 21 20 20 20 18 18 1
8 17
## 4 21 22 21 21 21 21 20 20 20 2
0 20
## 5 20 20 20 20 20 20 19 18 18 1
7 18
## 6 19 19 19 19 19 19 19 18 18 1
7 17
## temp22 temp23
## 1 15 16
## 2 16 16
## 3 18 18
## 4 20 19
## 5 18 18
## 6 17 17

Como podemos ver, cada fila de este dataframe corresponde a un día del año; las dos
primeras columnas especifican dia y mes concretos; las restantes columnas,
llamadas temp0 hasta temp23 registran la temperatura medida en el aeropuerto cada hora en
punto, desde las 0 a las 23 horas. En este dataframe, la variable temperatura (temp) se
encuentra en formato wide(ancho).
Para convertir este dataframe en otro que tenga una única variable temperatura medida 24
veces cada día, esto es, en formato long (largo), utilizaríamos la función reshape() del
siguiente modo:

temperatura=reshape(tempe, idvar = c("mes","dia"), varying = list(3:26),


v.names="temp",direction = "long", timevar="hora")
head(temperatura,10)
## mes dia hora temp
## 1.1.1 1 1 1 16
## 1.2.1 1 2 1 15
## 1.3.1 1 3 1 16
## 1.4.1 1 4 1 17
## 1.5.1 1 5 1 19
## 1.6.1 1 6 1 18
## 1.7.1 1 7 1 16
## 1.8.1 1 8 1 16
## 1.9.1 1 9 1 19
## 1.10.1 1 10 1 14

Aquí:
 idvar es la variable o variables (en este caso mes y dia) que se importan del archivo
original y que no corresponden a una variable que se encuentra desglosada en varias
columnas.
 varying es una lista donde se especifican las posiciones de las columnas que
corresponden a la variable que se quiere convertir de formato wide a formato long.
 v.names permite especificar el nombre que recibirá la variable que se encuentra en
formato wide una vez que se haya reescrito en formato long (o al revés)
 direction especifica la dirección en que se va a reformatear el dataframe (long,
como en este caso, o wide)
 timevar nombre de la variable que codifica el índice (número de orden) de cada
observación. Normalmente corresponde a la secuencia temporal en que se han
realizado las observaciones.
Como vemos, como resultado del reshape ahora tenemos una única variable temperatura y
se ha creado la variable hora; por defecto, el dataframe está ordenado por esta última
variable. Si queremos ordenarlo primero por mes, luego por día y por último por hora,
utilizamos la función order():

ord=with(temperatura, order(mes,dia,hora))
temperatura=temperatura[ord,]
head(temperatura,10)
## mes dia hora temp
## 1.1.1 1 1 1 16
## 1.1.2 1 1 2 16
## 1.1.3 1 1 3 16
## 1.1.4 1 1 4 16
## 1.1.5 1 1 5 15
## 1.1.6 1 1 6 15
## 1.1.7 1 1 7 15
## 1.1.8 1 1 8 15
## 1.1.9 1 1 9 15
## 1.1.10 1 1 10 17

Además, la variable hora no corresponde, en realidad a la hora, sino al orden de cada


observación dentro de cada día; si tenemos en cuenta que la primera observación se realiza a
las cero horas, la segunda a la una, la tercera a las dos, etc, podemos convertir esta variable
en la hora real de la observación simplemente restándole una unidad:

temperatura$hora=temperatura$hora-1
head(temperatura,10)
## mes dia hora temp
## 1.1.1 1 1 0 16
## 1.1.2 1 1 1 16
## 1.1.3 1 1 2 16
## 1.1.4 1 1 3 16
## 1.1.5 1 1 4 15
## 1.1.6 1 1 5 15
## 1.1.7 1 1 6 15
## 1.1.8 1 1 7 15
## 1.1.9 1 1 8 15
## 1.1.10 1 1 9 17

Representamos a continuación gráficamente la secuencia de observaciones de temperatura a


lo largo del periodo observado (1 de enero a 11 de julio). Para ello creamos en primer lugar la
variable fecha (ver la sección Fechas de este curso).

fecha=with(temperatura,paste(paste("2014",mes,dia,sep="-"),hora,sep=" "))
temperatura$fecha=as.POSIXlt(fecha,format="%Y-%m-%d %H")
with(temperatura,plot(fecha,temp,type="l",ylab="Temperatura (ºC)",main="T
emperaturas aeropuerto GC 2014"))

También podría gustarte