PANELIZE. Una función -preliminar- en R para transformar datos a formato panel

Hace un tiempo @ftiberti planteó un problema: tenía una base de datos (formato serie de tiempo) de la evolución de PBI per cápita por país. Pero el formato era incómodo: los países estaban en las columnas y los años en las filas*.
Year Austria Belgium ...
1946 1.956 4.574 ...
1947 2.166 4.800 ...
... ... ... ...
Era necesario llevarlos a formato de datos de panel para trabajarlos más cómodamente. O sea, a algo parecido a esto:
Year Country PBIpc
1946 Austria 1.956
1946 Belgium 4.574
... ... ...
1947 Austria 2.166
1947 Belgium 4.800
... ... ...
Hacerlo a mano iba a resultar una tarea muy engorrosa. Especialmente si se tiene en cuenta que eran alrededor de 65 años -filas- y 165 países -columnas-. Esto da una base de datos (en formato panel) de 10.660 registros. A partir de ahí se me ocurrió tratar de automatizar el proceso. Así que armé esta función (mi primera función en R) que trata de resolver ese problema, bastante común: convertir tablas de datos de series de tiempo con las unidades (países, provincias, individuos, etc.) en las columnas a un formato similar a un panel de datos.
En mi caso, sirvió para llevar dos bases de datos de cantidad de nacimientos y defunciones para la provincia de Chaco por departamento entre 1970 y 2010 con ese mismo formato (40 años en filas y 24 unidades en columnas) a formato panel. También la probé con la base de Madisson desde 1870 con casi todos sus campos (183 países y 141 años). Hasta ahora parece funcionar bastante bien.
Para correr la función sin problemas el data.frame debe tener los períodos de tiempo en las columnas y debe tratarse de una sola variable. A su vez, dicha variable debe estar en la primera columna. En caso de tener un data.frame o matriz con las unidades en las filas y los períodos en las columnas será necesario transponerla antes de correr la función.
panelize<-function(x,n.units,n.per){
        x<-as.matrix(x)
        n.units<-ncol(x)-1
        n.per<-nrow(x)
        col1<-rep(x[,1],n.units)
        col2<-c(x[,2:(n.units+1)])
        names<-colnames(x[,1:n.units+1])
        xpanel<-cbind(col1,col2)
        xpanel<-as.data.frame(xpanel)
        xpanel<-xpanel[order(xpanel$col1),]
        xpanel<-data.frame(cbind(names,xpanel))
}
Los argumentos de la función son:
(OBLIGATORIO) x=es la matriz o data.frame que desea ser convertido
(OPCIONAL) n.units= es la cantidad de unidades de análisis
(OPCIONAL) n.per=es la cantidad de periodos
Obviamente, una vez corrida la función es necesario editar el data.frame resultante correctamente: nombres de columnas y filas, tipo de campo, etc..
Perdón por el desprolijo html. Ojalá sirva... Como siempre, los comentarios y mejoras son bienvenidas.
-------------------------------------------------------------------------
*Los datos eran del viejo Angus Maddison. Acá, los habíamos usado en su momento.

Comentarios

Entradas populares de este blog

Sobre la multicausalidad

Número efectivo de partidos en elecciones presidenciales 1983-2011

El ruido de las capitales (vol. 1)