Usando Remodelar de ancho a largo en R

Estoy tratando de remodelar los datos de ancho a largo en R.

mis datos en formato ancho se ven así:

Tengo la siguiente matriz de datos: en las filas tengo las diferentes compañías, y en las columnas tengo diferentes variables de años diferentes. (ganancias_2012, ganancias_2011, ganancias_2010, …, tot_assets_2012, tot_assets_2011, y más.

Me gustaría reorganizar esto en un formato largo:

teniendo solo estas columnas: compañía, año, variables (ganancias, tot_assets, ..)

Lo he estado intentando durante días. También consulté http://www.ats.ucla.edu/stat/r/faq/reshape.htm en busca de ayuda pero no pude entender cómo reestructuraron sus datos y cómo separar el año.

Gracias de antemano por su ayuda.

Saludos

Gritti

PD: Como soy nuevo en R y la ayuda brindada en R parece ser bastante técnica, aprecio cualquier pista para una introducción muy simple.

Aquí hay tres ejemplos (junto con algunos datos de muestra que creo que son representativos de lo que describió).

Aquí están los datos de muestra:

 set.seed(1) mydf <- data.frame( company = LETTERS[1:4], earnings_2012 = runif(4), earnings_2011 = runif(4), earnings_2010 = runif(4), assets_2012 = runif(4), assets_2011 = runif(4), assets_2010 = runif(4) ) mydf # company earnings_2012 earnings_2011 earnings_2010 assets_2012 assets_2011 assets_2010 # 1 A 0.2655087 0.2016819 0.62911404 0.6870228 0.7176185 0.9347052 # 2 B 0.3721239 0.8983897 0.06178627 0.3841037 0.9919061 0.2121425 # 3 C 0.5728534 0.9446753 0.20597457 0.7698414 0.3800352 0.6516738 # 4 D 0.9082078 0.6607978 0.17655675 0.4976992 0.7774452 0.1255551 

Opción 1: reshape

Una limitación es que no manejará conjuntos de datos "desequilibrados" (por ejemplo, si no tuviera "assets_2010" como parte de sus datos, esto no funcionaría).

 reshape(mydf, direction = "long", idvar="company", varying = 2:ncol(mydf), sep = "_") # company time earnings assets # A.2012 A 2012 0.26550866 0.6870228 # B.2012 B 2012 0.37212390 0.3841037 # C.2012 C 2012 0.57285336 0.7698414 # D.2012 D 2012 0.90820779 0.4976992 # A.2011 A 2011 0.20168193 0.7176185 # B.2011 B 2011 0.89838968 0.9919061 # C.2011 C 2011 0.94467527 0.3800352 # D.2011 D 2011 0.66079779 0.7774452 # A.2010 A 2010 0.62911404 0.9347052 # B.2010 B 2010 0.06178627 0.2121425 # C.2010 C 2010 0.20597457 0.6516738 # D.2010 D 2010 0.17655675 0.1255551 

Opción 2: el paquete "reshape2"

Muy popular por su syntax. Necesita un poco de procesamiento antes de que funcione, ya que los nombres de las columnas deben dividirse para que podamos obtener este tipo de datos de "doble ancho". Es capaz de manejar datos desequilibrados, pero no será el mejor si sus columnas variables son de diferentes tipos de columnas (numéricos, caracteres, factores).

 library(reshape2) dfL <- melt(mydf, id.vars="company") dfL <- cbind(dfL, colsplit(dfL$variable, "_", c("var", "year"))) dcast(dfL, company + year ~ var, value.var="value") # company year assets earnings # 1 A 2010 0.9347052 0.62911404 # 2 A 2011 0.7176185 0.20168193 # 3 A 2012 0.6870228 0.26550866 # 4 B 2010 0.2121425 0.06178627 # 5 B 2011 0.9919061 0.89838968 # 6 B 2012 0.3841037 0.37212390 # 7 C 2010 0.6516738 0.20597457 # 8 C 2011 0.3800352 0.94467527 # 9 C 2012 0.7698414 0.57285336 # 10 D 2010 0.1255551 0.17655675 # 11 D 2011 0.7774452 0.66079779 # 12 D 2012 0.4976992 0.90820779 

Opción 3: merged.stack desde "splitstackshape"

merged.stack de mi paquete "splitstackshape" tiene una syntax bastante sencilla y debería ser bastante rápido si necesitas terminar con este tipo de estructura de "doble ancho". Fue creado para poder manejar datos desequilibrados y dado que trata las columnas por separado, no tendrá problemas para convertir los tipos de columnas.

 library(splitstackshape) merged.stack(mydf, id.vars="company", var.stubs=c("earnings", "assets"), sep = "_") # company .time_1 earnings assets # 1: A 2010 0.62911404 0.9347052 # 2: A 2011 0.20168193 0.7176185 # 3: A 2012 0.26550866 0.6870228 # 4: B 2010 0.06178627 0.2121425 # 5: B 2011 0.89838968 0.9919061 # 6: B 2012 0.37212390 0.3841037 # 7: C 2010 0.20597457 0.6516738 # 8: C 2011 0.94467527 0.3800352 # 9: C 2012 0.57285336 0.7698414 # 10: D 2010 0.17655675 0.1255551 # 11: D 2011 0.66079779 0.7774452 # 12: D 2012 0.90820779 0.4976992 
    Intereting Posts