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*.
Era necesario llevarlos a formato de datos de panel para trabajarlos más cómodamente. O sea, a algo parecido a esto:
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.
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.
Year | Austria | Belgium | ... |
1946 | 1.956 | 4.574 | ... |
1947 | 2.166 | 4.800 | ... |
... | ... | ... | ... |
Year | Country | PBIpc |
1946 | Austria | 1.956 |
1946 | Belgium | 4.574 |
... | ... | ... |
1947 | Austria | 2.166 |
1947 | Belgium | 4.800 |
... | ... | ... |
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)) }
(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