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

Inferencia ecológica (o una introducción a algunos posts que se vendrán)

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