Tengo algunos problemas para convertir mi data.framede una mesa ancha a una larga. Por el momento se ve así:
Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246
Ahora me gustaría transformar esto data.frameen un largo data.frame. Algo como esto:
Code Country Year Value
AFG Afghanistan 1950 20,249
AFG Afghanistan 1951 21,352
AFG Afghanistan 1952 22,532
AFG Afghanistan 1953 23,557
AFG Afghanistan 1954 24,555
ALB Albania 1950 8,097
ALB Albania 1951 8,986
ALB Albania 1952 10,058
ALB Albania 1953 11,123
ALB Albania 1954 12,246
He mirado y ya he intentado usar melt()las reshape()funciones y como algunas personas sugirieron en preguntas similares. Sin embargo, hasta ahora solo obtengo resultados desordenados.
Si es posible, me gustaría hacerlo con la reshape()función, ya que parece un poco más agradable de manejar.

Respuestas:
reshape()toma un tiempo acostumbrarse, igual quemelt/cast. Aquí hay una solución con remodelación, asumiendo que su marco de datos se llamad:fuente
Tres soluciones alternativas:
1) con tabla de datos:
Puede usar la misma
meltfunción que en elreshape2paquete (que es una implementación extendida y mejorada).meltfromdata.tabletambién tiene más parámetros que lameltfunción-fromreshape2. Por ejemplo, también puede especificar el nombre de la columna variable:lo que da:
Algunas anotaciones alternativas:
2) con tidyr:
Algunas anotaciones alternativas:
3) con remodelar2:
Algunas notaciones alternativas que dan el mismo resultado:
NOTAS
NAvalores, puede agregar tantona.rm = TRUEa lasmeltfunciones como a lasgatherfunciones.Otro problema con los datos es que los valores serán leídos por R como valores de caracteres (como resultado de
,los números). Puede reparar eso congsubyas.numeric:O directamente con
data.tableodplyr:Datos:
fuente
idytimeen su marco de datos,meltno podría decir qué quiere hacer en este caso.id.varscomo elmeasure.vars.id.varsymeasure.varsse puede especificar en la primera alternativa, perdón por el desastre, es mi culpa.-c(var1, var2)...-c(var1, var2)que omite estas variables al transformar los datos de formato ancho a largo.Usando el paquete de remodelación :
fuente
Con
tidyr_1.0.0, otra opción espivot_longerdatos
fuente
gatherse está retirando ypivot_longerahora es la forma correcta de lograrlo.Como esta respuesta está etiquetada con r-faq, Sentí que sería útil compartir otra alternativa de la base R:
stack.Sin embargo, tenga en cuenta que eso
stackno funciona confactors, solo funciona siis.vectores asíTRUE, y de la documentación parais.vector, encontramos que:Estoy usando los datos de muestra de la respuesta de @ Jaap , donde los valores en las columnas del año son
factors.Aquí está el
stackenfoque:fuente
Aquí hay otro ejemplo que muestra el uso de
gatherfromtidyr. Puede seleccionar las columnasgatherquitándolas individualmente (como hago aquí) o incluyendo los años que desea explícitamente.Tenga en cuenta que, para manejar las comas (y las X agregadas si
check.names = FALSEno están configuradas), también estoy usandodplyr'mutate withparse_numberfrom'readrpara convertir los valores de texto nuevamente en números. Todos estos son parte detidyversey, por lo tanto, se pueden cargar junto conlibrary(tidyverse)Devoluciones:
fuente
Aquí está un sqldf solución:
Para realizar la consulta sin escribir todo, puede usar lo siguiente:
Gracias a G. Grothendieck por implementarlo.
Desafortunadamente, no creo eso
PIVOTyUNPIVOTfuncionaríaRSQLite. Si desea escribir su consulta de una manera más sofisticada, también puede echar un vistazo a estas publicaciones:Usando la
sprintfescritura de consultas sql o Pase variables asqldffuente
También puede usar el
cdatapaquete, que usa el concepto de tabla de control (transformación):Actualmente estoy explorando ese paquete y lo encuentro bastante accesible. Está diseñado para transformaciones mucho más complicadas e incluye la transformación inversa. Hay un tutorial disponible.
fuente