Como alterar dados entre formatos largos e longos no R? [fechadas]


32

Você pode ter dados em formato amplo ou em formato longo. Isso é muito importante, pois os métodos utilizáveis ​​são diferentes, dependendo do formato. Eu sei que você tem que trabalhar com melt()e a cast()partir do pacote de reformulação, mas parece que algumas coisas eu não entendo.

Alguém pode me dar uma breve visão geral de como você faz isso?


Por favor, forneça o exemplo do que você deseja alcançar. O que exatamente você não entende?
Mvctas

3
Aqui está o meu post com exemplos de uso de melte cast. A conversão do formato amplo para o longo é feita em um estágio. Realmente não há nada mais especial.
mpiktas

Bem-vindo às estatísticas. Você pode achar que é útil incluir um conjunto de dados pequeno e reproduzível na sua pergunta para explicar o que você deseja. Leia sigmafield.org/2011/01/18/… para obter mais informações.
PaulHurleyuk

Veja esta pergunta SO para muitas maneiras de fazer isso.
Axeman

Respostas:


26

Existem vários recursos no site de Hadley Wickham para o pacote (agora chamado reshape2), incluindo um link para um artigo sobre o pacote no Journal of Statistical Software.

Aqui está um breve exemplo do artigo:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Observamos que os dados estão na forma ampla. Para ir para o formato longo, tornamos o smithsquadro de dados fundido :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Observe como melt()escolheu uma das variáveis ​​como o ID, mas podemos declarar explicitamente qual usar via argumento 'id':

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Aqui está outro exemplo de ?cast:

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Se armazenarmos o quadro de dados fundido, podemos converter em outras formas. Na nova versão do reshape(chamado reshape2), existem funções acast()e dcast()retornando um resultado do tipo matriz (matriz, matriz, vetor) ou um quadro de dados, respectivamente. Essas funções também assumem uma função agregadora (por exemplo mean()) para fornecer resumos de dados na forma fundida. Por exemplo, seguindo o exemplo de Qualidade do ar acima, podemos gerar, de forma ampla, valores médios mensais para as variáveis ​​no conjunto de dados:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

Há realmente apenas duas funções principais reshape2: melt()e o acast()e dcast()emparelhamento. Veja os exemplos nas páginas de ajuda para essas duas funções, consulte o site da Hadley (link acima) e o artigo que mencionei. Isso deve começar.

Você também pode examinar o plyrpacote de Hadley, que faz coisas semelhantes, reshape2mas foi projetado para fazer muito mais além disso.


dcast(aqm, month ~ variable), o que isso faria sem a função de agregação?
qed

@CravingSpirit retornaria o número de observações para cada variável. Leia o ?dcastque lhe diria isso (veja os detalhes para o argumento fun.aggregate).
Reinstate Monica - G. Simpson

8
  • O Quick-R tem um exemplo simples de como usar o pacote remodelado

  • Veja também ?reshape( LINK ) o modo Base R de se mover entre os formatos amplo e longo.


7

Você não precisa usar melte cast.

Remodelar dados pode ser feito de várias maneiras. No seu exemplo particular em sua citação, usar recastwith aggregateera redundante porque aggregatea tarefa é adequada por si só.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

Eu gosto de como, no seu blog, você explica o que meltestá fazendo. Pouquíssimas pessoas entendem isso e, depois que você o vê, fica mais fácil ver como castfunciona e como você pode escrever suas próprias funções, se quiser.



2

Apenas observando que não há referência aos métodos de remodelagem mais eficientes e abrangentes data.tableaqui, por isso estou postando sem mais comentários a excelente resposta de Zach / Arun no StackOverflow para uma pergunta semelhante:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

E, em particular, há a maravilhosa vinheta na data.tablepágina do GitHub:

https://github.com/Rdatatable/data.table/wiki/Getting-started

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.