Converter dados em formato amplo e formato longo

May 22, 2011
By

This post was kindly contributed by Ridículas - go there to comment and to read the full post.

Respostas observadas em função dos fatores em experimento com a cultura da soja.

A coisa mais comum para quem analisa dados e ter que editar o formato dos dados. Dificilmente você recebe os dados no formato correto. Muitas pessoas fazem de suas planilhas de dados uma arte, com cédulas coloridas, linhas e colunas com textos em diversos formatos.

Dados de medidas repetidas tem a característica de cada nova medida repetida ser uma nova coluna na planilha (formato amplo). A maioria dos métodos de análise requer que os dados estejam no formato longo, ou seja, cada linha é um registro, cada coluna é uma variável. Portanto, temos que converter o formato dos dados. Isso vai se tornar claro/simples com os comandos que apresento nessa ridícula.

Os pacotes reshape e plyr contém funções úteis para a manipulação/restruturação dos dados. Os comandos abaixo importam dados no formato amplo, passam para o formato longo e retornam para o formato amplo.

> #-----------------------------------------------------------------------------
> # dados de espessura de fibra de Schinus
>
> require(reshape)
>
> # dados estão no formato amplo, colunas são secções no tronco da árvore
> fibra <- read.table("http://www.leg.ufpr.br/~walmes/ridiculas/fibra.txt",
+                     header=TRUE, sep="\t")
> str(fibra)
'data.frame':	150 obs. of  7 variables:
 $ arvore : int  1 1 1 1 1 1 1 1 1 1 ...
 $ amostra: int  1 2 3 4 5 6 7 8 9 10 ...
 $ A      : num  2.61 2.43 2.09 2.5 2.06 ...
 $ B      : num  3.17 2.68 2.43 2 1.85 ...
 $ C      : num  2.17 4.19 4.82 5.54 3.26 ...
 $ D      : num  3.7 2.2 3.5 2.61 3.43 ...
 $ E      : num  2.4 3.5 3.11 2.4 3.26 ...
>
> # passamos os dados para o formato longo, criou uma coluna para secção
> fibra <- melt(fibra, id=c("arvore", "amostra"))
> str(fibra)
'data.frame':	750 obs. of  4 variables:
 $ arvore  : int  1 1 1 1 1 1 1 1 1 1 ...
 $ amostra : int  1 2 3 4 5 6 7 8 9 10 ...
 $ variable: Factor w/ 5 levels "A","B","C","D",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ value   : num  2.61 2.43 2.09 2.5 2.06 ...
>
> # retornamos os dados para o formato amplo
> fibra <- adply(cast(fibra, amostra~arvore~variable,
+                     value="value", fun=NULL), c(1,2))
> str(fibra)
'data.frame':	150 obs. of  7 variables:
 $ amostra: chr  "1" "2" "3" "4" ...
 $ arvore : chr  "1" "1" "1" "1" ...
 $ A      : num  2.61 2.43 2.09 2.5 2.06 ...
 $ B      : num  3.17 2.68 2.43 2 1.85 ...
 $ C      : num  2.17 4.19 4.82 5.54 3.26 ...
 $ D      : num  3.7 2.2 3.5 2.61 3.43 ...
 $ E      : num  2.4 3.5 3.11 2.4 3.26 ...
>
> #-----------------------------------------------------------------------------

Os dados do experimento em soja já estão no formato longo, exigido para fazer ajuste de modelos lineares. Nesse experimento foram observadas quatro variáveis resposta. Para fazer uma análise exploratória conjunta, eu passei os dados para o formato longo. Assim, tenho uma coluna que identifica a resposta observada e outra o valor. Com os recursos do pacote lattice eu fiz um gráfico de dispersão para tirar informações iniciais dos resultados do experimento.

#-----------------------------------------------------------------------------
# dados

soja <- read.table("http://www.leg.ufpr.br/~walmes/cursoR/soja.txt",
                   header=TRUE, sep="\t", dec=",")
names(soja)[4:7] <- c("Rendimento de grãos (g/vaso)",
                      "Massa de 100 grãos (g)",
                      "K no grão (g/kg)", "P no grão (g/kg)")
str(soja)

#-----------------------------------------------------------------------------
# criando uma coluna que identifica as variáveis resposta

soja2 <- melt(soja, id=1:3)
str(soja2)

#-----------------------------------------------------------------------------
# gráfico para análise exploratória

require(lattice)

#png("f006.png", w=500, h=400)
mycols <- colors()[c(47,81,614)]
trellis.par.set(superpose.symbol=list(col=mycols, pch=c(15,17,19)),
                superpose.line=list(col=mycols),
                strip.background=list(col="gray90"))
xyplot(value~potassio|variable, groups=agua, data=soja2,
       xlab="Potássio no solo (mg/dm³)", ylab="Valor observado",
       key=list(title="Níveis de umidade do solo (%)", cex.title=1,
         columns=3, type="o", divide=1,
         lines=list(pch=trellis.par.get("superpose.symbol")$pch,
           col=trellis.par.get("superpose.symbol")$col),
         text=list(c(format(unique(soja$agua))))),
       type=c("p","a","g"), jitter.x=TRUE,
       scales=list(y=list(relation="free")), layout=c(2,2))
#dev.off()

#-----------------------------------------------------------------------------
# para ver as configurações gráficas da lattice

library(TeachingDemos)
TkListView(trellis.par.get())

#-----------------------------------------------------------------------------

Tags: , , , , , , ,

Comments are closed.