Tengo algunos problemas para convertir mi data.frame
de 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.frame
en 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
melt
función que en elreshape2
paquete (que es una implementación extendida y mejorada).melt
fromdata.table
también tiene más parámetros que lamelt
funció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
NA
valores, puede agregar tantona.rm = TRUE
a lasmelt
funciones como a lasgather
funciones.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 congsub
yas.numeric
:O directamente con
data.table
odplyr
:Datos:
fuente
id
ytime
en su marco de datos,melt
no podría decir qué quiere hacer en este caso.id.vars
como elmeasure.vars
.id.vars
ymeasure.vars
se 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_longer
datos
fuente
gather
se está retirando ypivot_longer
ahora 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
stack
no funciona confactor
s, solo funciona siis.vector
es 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
factor
s.Aquí está el
stack
enfoque:fuente
Aquí hay otro ejemplo que muestra el uso de
gather
fromtidyr
. Puede seleccionar las columnasgather
quitá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 = FALSE
no están configuradas), también estoy usandodplyr
'mutate withparse_number
from'readr
para convertir los valores de texto nuevamente en números. Todos estos son parte detidyverse
y, 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
PIVOT
yUNPIVOT
funcionaríaR
SQLite
. Si desea escribir su consulta de una manera más sofisticada, también puede echar un vistazo a estas publicaciones:Usando la
sprintf
escritura de consultas sql o Pase variables asqldf
fuente
También puede usar el
cdata
paquete, 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