Estou com alguns problemas para converter minha data.frame
tabela ampla para uma tabela longa. No momento, fica assim:
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
Agora eu gostaria de transformar isso data.frame
em um longo data.frame
. Algo assim:
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
Eu olhei e já tentei usar melt()
as reshape()
funções e como algumas pessoas sugeriam em perguntas semelhantes. No entanto, até agora eu só tenho resultados confusos.
Se for possível, eu gostaria de fazê-lo com a reshape()
função, pois parece um pouco mais agradável de manusear.
Respostas:
reshape()
leva um tempo para se acostumar, assim comomelt
/cast
. Aqui está uma solução com remodelagem, assumindo que seu quadro de dados seja chamadod
:fonte
Três soluções alternativas:
1) Com Tabela de dados:
Você pode usar a mesma
melt
função doreshape2
pacote (que é uma implementação estendida e aprimorada).melt
fromdata.table
também possui mais parâmetros do que amelt
função fromreshape2
. Você também pode, por exemplo, especificar o nome da coluna variável:que dá:
Algumas notações alternativas:
2) Com tidyr:
Algumas notações alternativas:
3) Com reshape2:
Algumas notações alternativas que dão o mesmo resultado:
NOTAS:
NA
valores, você pode adicionarna.rm = TRUE
aosmelt
bem como asgather
funções.Outro problema com os dados é que os valores serão lidos por R como valores de caracteres (como resultado dos
,
números). Você pode reparar isso comgsub
eas.numeric
:Ou diretamente com
data.table
oudplyr
:Dados:
fonte
id
etime
no seu quadro de dados;melt
não poderia dizer o que você deseja fazer neste caso.id.vars
e omeasure.vars
.id.vars
emeasure.vars
pode ser especificado na primeira alternativa, desculpe pela bagunça, a culpa é minha.-c(var1, var2)
...-c(var1, var2)
, omite essas variáveis ao transformar os dados de formato amplo para longo.Usando remodelar pacote:
fonte
Com
tidyr_1.0.0
, outra opção épivot_longer
dados
fonte
gather
está sendo aposentado epivot_longer
agora é a maneira correta de fazer isso.Como esta resposta está marcada com r-faq, Eu senti que seria útil para compartilhar uma outra alternativa da base R:
stack
.Observe, no entanto, que
stack
não funciona comfactor
s - só funciona seis.vector
estiverTRUE
e, a partir da documentação deis.vector
, descobrimos que:Estou usando os dados de exemplo da resposta de @ Jaap , onde os valores nas colunas do ano são
factor
s.Aqui está a
stack
abordagem:fonte
Aqui está outro exemplo mostrando o uso de
gather
fromtidyr
. Você pode selecionar as colunasgather
removendo-as individualmente (como eu faço aqui) ou incluindo os anos que deseja explicitamente.Observe que, para lidar com as vírgulas (e os X adicionados, se
check.names = FALSE
não estiverem definidos), também estou usandodplyr
's mutate withparse_number
fromreadr
para converter os valores de texto em números. Tudo isso faz partetidyverse
e pode ser carregado junto com olibrary(tidyverse)
Devoluções:
fonte
Aqui está um sqldf solução:
Para fazer a consulta sem digitar tudo, você pode usar o seguinte:
Agradecimentos a G. Grothendieck por implementá-lo.
Infelizmente, eu não acho isso
PIVOT
eUNPIVOT
iria trabalhar para issoR
SQLite
. Se você deseja escrever sua consulta de maneira mais sofisticada, também pode dar uma olhada nessas postagens:Usando a
sprintf
escrita de consultas sql ou passar variáveis parasqldf
fonte
Você também pode usar o
cdata
pacote, que usa o conceito de tabela de controle (transformação):Atualmente, estou explorando esse pacote e o acho bastante acessível. Ele foi projetado para transformações muito mais complicadas e inclui a retro-transformação. Existe um tutorial disponível.
fonte