Capítulo 4 Manipulação de dados no R

Com os dados carregados no ambiente, seja em vetores, tabelas e data frames (essa a forma mais comum de armazenar os dados), podemos fazer várias operações que envolvem filter, selecionar, rearranjar, renomear, transformar, filtrar, dentre outras ações.

4.1 Conjunto de dados

Nesta seção, iremos trabalhar com um conjunto de dados com informações sobre isolados de Fusarium graminearum obtidos de espigas de trigo com sintomas coletadas em visitas à lavouras nos estados do RS e PR. Diversas informações foram obtidas para cada lavoura (local, ano, latitude, longitude, etc), sobre a doença (incidencia e severidade) e da identificação do isolado (espécie e genótipo). Os dados foram informados em uma planilha excel e o arquivo que será trabalho foi nomeado como “survey2.csv”. Vamos carregar esse conjunto de dados no ambiente e atribuir a um data frame survey2.

library(readr)
survey2 <- read_csv ("data/survey2.csv")

library(dplyr)
# A função glimpse é similar à função str do R base
glimpse(survey2) # mostra todas as variáveis, uma em cada linha
## Observations: 671
## Variables: 11
## $ field    <dbl> 25, 25, 25, 25, 25, 26, 26, 26, 26, 36, 48, 49, 49, 4...
## $ year     <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,...
## $ location <chr> "Agua Santa", "Agua Santa", "Agua Santa", "Agua Santa...
## $ state    <chr> "RS", "RS", "RS", "RS", "RS", "RS", "RS", "RS", "RS",...
## $ lat      <dbl> -28.30617, -28.30617, -28.28964, -28.28964, -28.28964...
## $ long     <dbl> -52.08281, -52.08281, -51.97308, -51.97308, -51.97308...
## $ residue  <chr> "soybean", "soybean", "soybean", "soybean", "soybean"...
## $ inc      <dbl> 68.24, 68.24, 68.24, 68.24, 68.24, 34.00, 34.00, 34.0...
## $ sev      <dbl> 9.47, 9.47, 9.47, 9.47, 9.47, 3.73, 3.73, 3.73, 3.73,...
## $ species  <chr> "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra...
## $ genotype <chr> "15-ADON", "15-ADON", "15-ADON", "15-ADON", "15-ADON"...

4.2 Selecionando colunas

Eventualmente queremos trabalhar com apenas algumas variáveis, que são armazenadas em um novo data frame. No R base, a seleção pode ser feita por argumentos para seleção de colunas pelo nome das mesmas. Uma possibilidade é criar um vetor “filtro” com o nome das colunas que queremos selecionar e atribuir esse vetor à um novo data frame.

# seleciona as três colunas conforme abaixo
filtro <- c("field", "location", "species")

# usando os colchetes, seleciona as variáveis do data frame survey2
survey3 <- survey2[filtro]

# visualiza o novo data frame
glimpse(survey3)
## Observations: 671
## Variables: 3
## $ field    <dbl> 25, 25, 25, 25, 25, 26, 26, 26, 26, 36, 48, 49, 49, 4...
## $ location <chr> "Agua Santa", "Agua Santa", "Agua Santa", "Agua Santa...
## $ species  <chr> "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra...
# outra forma seria diretamente pelo número da coluna
survey3a <- survey2[c(2:3, 10)]
glimpse(survey3a) 
## Observations: 671
## Variables: 3
## $ year     <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,...
## $ location <chr> "Agua Santa", "Agua Santa", "Agua Santa", "Agua Santa...
## $ species  <chr> "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra...

No pacote dplyr, a função select permite selecionar as colunas pelo nome. Veja em ?select as várias funções especiais de seleção.

survey4 <- select(survey2, year, location, species)
survey4 <- select(survey2, c(2:3, 10)) # pelo número das colunas

glimpse(survey4) # vai aparecer em um formato mais compacto
## Observations: 671
## Variables: 3
## $ year     <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010,...
## $ location <chr> "Agua Santa", "Agua Santa", "Agua Santa", "Agua Santa...
## $ species  <chr> "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra...

A seleção também pode ser feita pela eliminação de algumas variáveis e preservação das demais. Vamos selecionar do data frame survey4 todas as variáveis menos “species”. Para isso, é colocado o sinal de menos na frente da coluna.

select(survey4, -species)
## # A tibble: 671 x 2
##     year location  
##    <dbl> <chr>     
##  1  2010 Agua Santa
##  2  2010 Agua Santa
##  3  2010 Agua Santa
##  4  2010 Agua Santa
##  5  2010 Agua Santa
##  6  2010 Agua Santa
##  7  2010 Agua Santa
##  8  2010 Agua Santa
##  9  2010 Agua Santa
## 10  2011 Agua Santa
## # ... with 661 more rows
# elimina várias colunas em um intervalo sequencial 
select(survey2, -c(residue:genotype)) 
## # A tibble: 671 x 6
##    field  year location   state   lat  long
##    <dbl> <dbl> <chr>      <chr> <dbl> <dbl>
##  1    25  2010 Agua Santa RS    -28.3 -52.1
##  2    25  2010 Agua Santa RS    -28.3 -52.1
##  3    25  2010 Agua Santa RS    -28.3 -52.0
##  4    25  2010 Agua Santa RS    -28.3 -52.0
##  5    25  2010 Agua Santa RS    -28.3 -52.0
##  6    26  2010 Agua Santa RS    -28.7 -51.2
##  7    26  2010 Agua Santa RS    -28.7 -51.2
##  8    26  2010 Agua Santa RS    -28.7 -51.2
##  9    26  2010 Agua Santa RS    -28.3 -51.5
## 10    36  2011 Agua Santa RS    -28.4 -53.0
## # ... with 661 more rows

4.3 Selecionando linhas

No pacote dplyr a função filter permite selecionar linhas segundo critérios. No data frame survey2 vamos fazer algumas operações para selecionar e contar o número de casos segundo algum critério de filtro.

# filtra somente as linhas em que a incidência é maior que 80
filter(survey2, inc > 70) 
## # A tibble: 18 x 11
##    field  year location state   lat  long residue   inc   sev species
##    <dbl> <dbl> <chr>    <chr> <dbl> <dbl> <chr>   <dbl> <dbl> <chr>  
##  1     2  2010 Carazin~ RS    -28.3 -52.7 soybean  72.5 14.3  Fgra   
##  2     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5 14.3  Fgra   
##  3     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5 14.3  Fgra   
##  4     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5 14.3  Fgra   
##  5     6  2010 Carazin~ RS    -28.3 -51.7 soybean  70.7  8.13 Fasi   
##  6     6  2010 Carazin~ RS    -28.3 -52.9 soybean  70.7  8.13 Fgra   
##  7     6  2010 Carazin~ RS    -28.4 -52.9 soybean  70.7  8.13 Fgra   
##  8     6  2010 Carazin~ RS    -28.4 -52.9 soybean  70.7  8.13 Fgra   
##  9     6  2010 Carazin~ RS    -28.4 -52.9 soybean  70.7  8.13 Fgra   
## 10    13  2009 Condor   RS    -27.6 -53.3 soybean  70.5 12.8  Fgra   
## 11    13  2009 Condor   RS    -27.6 -53.3 soybean  70.5 12.8  Fgra   
## 12    13  2009 Condor   RS    -27.6 -53.3 soybean  70.5 12.8  Fgra   
## 13    13  2009 Condor   RS    -27.6 -53.3 soybean  70.5 12.8  Fgra   
## 14    24  2009 Lageado~ RS    -28.1 -52.2 soybean  71    5.22 Fgra   
## 15    24  2009 Lageado~ RS    -28.1 -52.2 soybean  71    5.22 Fgra   
## 16    15  2009 Palmeir~ RS    -27.8 -53.4 corn     90.0 18.5  Fgra   
## 17    15  2009 Palmeir~ RS    -27.8 -53.4 corn     90.0 18.5  Fgra   
## 18    15  2009 Palmeir~ RS    -27.8 -53.4 corn     90.0 18.5  Fgra   
## # ... with 1 more variable: genotype <chr>
# retorna o número de casos que atendem ao critério
count(filter(survey2, inc > 70)) 
## # A tibble: 1 x 1
##       n
##   <int>
## 1    18
# pode-se criar um dataframe
survey_inc75 <- filter(survey2, inc > 75) 

# múltiplos argumentos de seleção
filter(survey2, inc > 50 & sev > 10)
## # A tibble: 24 x 11
##    field  year location state   lat  long residue   inc   sev species
##    <dbl> <dbl> <chr>    <chr> <dbl> <dbl> <chr>   <dbl> <dbl> <chr>  
##  1     2  2010 Carazin~ RS    -28.3 -52.7 soybean  72.5  14.3 Fgra   
##  2     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5  14.3 Fgra   
##  3     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5  14.3 Fgra   
##  4     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5  14.3 Fgra   
##  5     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  6     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  7     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  8     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  9     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
## 10    13  2009 Condor   RS    -27.6 -53.3 soybean  70.5  12.8 Fgra   
## # ... with 14 more rows, and 1 more variable: genotype <chr>
# note abaixo que o sinal de igual é ==
filter(survey2, location == "Carazinho" & year == "2010")
## # A tibble: 28 x 11
##    field  year location state   lat  long residue   inc   sev species
##    <dbl> <dbl> <chr>    <chr> <dbl> <dbl> <chr>   <dbl> <dbl> <chr>  
##  1     2  2010 Carazin~ RS    -28.3 -52.7 soybean  72.5  14.3 Fgra   
##  2     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5  14.3 Fgra   
##  3     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5  14.3 Fgra   
##  4     2  2010 Carazin~ RS    -28.3 -52.8 soybean  72.5  14.3 Fgra   
##  5     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  6     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  7     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  8     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
##  9     3  2010 Carazin~ RS    -28.3 -52.8 soybean  67    18.6 Fgra   
## 10     4  2010 Carazin~ RS    -28.3 -51.4 soybean  43.5  17.5 Fcor   
## # ... with 18 more rows, and 1 more variable: genotype <chr>

4.4 Renomeando variáveis

Conforme já visto, a função fix permite abrir o conjunto em um editor visual para fazer alterações, inclusive modificar o nome das colunas. Vamos traduzir o nome das variáveis no dataframe survey3.

colnames(survey3)
## [1] "field"    "location" "species"
# fix(survey3)
glimpse(survey3)
## Observations: 671
## Variables: 3
## $ field    <dbl> 25, 25, 25, 25, 25, 26, 26, 26, 26, 36, 48, 49, 49, 4...
## $ location <chr> "Agua Santa", "Agua Santa", "Agua Santa", "Agua Santa...
## $ species  <chr> "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra...
# verifica se o nome foi alterado
colnames(survey3)
## [1] "field"    "location" "species"

No R base, a troca de nomes pode ser feita para todas as variáveis, desde que informadas na mesma sequencia em que se apresentam no data frame.

colnames(survey2)
##  [1] "field"    "year"     "location" "state"    "lat"      "long"    
##  [7] "residue"  "inc"      "sev"      "species"  "genotype"
names(survey2) <- c("campo","ano","local", "estado", "lat", "long", "residuo","inc", "sev", "especie", "genotipo") 
colnames(survey2)
##  [1] "campo"    "ano"      "local"    "estado"   "lat"      "long"    
##  [7] "residuo"  "inc"      "sev"      "especie"  "genotipo"

Pode-se também alterar apenas algumas variáveis, usando a função names do R base.

names(survey2)[names(survey2)=="inc"] <- "incidencia"
names(survey2)[names(survey2)=="sev"] <- "severidade"
colnames(survey2) # verifica
##  [1] "campo"      "ano"        "local"      "estado"     "lat"       
##  [6] "long"       "residuo"    "incidencia" "severidade" "especie"   
## [11] "genotipo"

Alternativamente, no pacote plyr a função rename é mais intuitiva e simples do que a função names. Veja o exemplo abaixo como mudar o nome da variável genotipo para quimiotipo.

library(plyr)
survey2 <- rename(survey2, c("genotipo" = "quimiotipo"))

4.5 Adicionando variáveis

No R base, a forma mais rápida de se adicionar uma variável é diretamente no dataframe usando o $ após o nome do data frame. Abaixo, iremos criar uma variável que codifica cada isolado com um número sequencial.

# cria o vetor do tamanho do número de linhas (nrow) do dataframe survey2
index <- seq(from = 1, to = nrow(survey2))
head(index, 20) # primeiras 20 linhas
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
tail(index)     # últimas 6 linhas
## [1] 666 667 668 669 670 671
# adiciona a variável ao data frame
survey2$index <- index
colnames(survey2)
##  [1] "campo"      "ano"        "local"      "estado"     "lat"       
##  [6] "long"       "residuo"    "incidencia" "severidade" "especie"   
## [11] "quimiotipo" "index"
# também poderia ser feito diretamente sem criar o vetor antes
survey2$index <- seq(from = 1, to = nrow(survey2))

# pode também ser usado para criar variáveis com transformações
# cria nova variável de incidência com nova escala
survey2$incidencia2 <- survey2$incidencia/100

Alternativamente, podemos usar a função mutate do pacote dplyr para acrescentar uma ou mais colunas.

survey2 <- mutate(survey2, incidencia3 = incidencia2 * 100)
head(survey2$incidencia3)
## [1] 68.24 68.24 68.24 68.24 68.24 34.00

4.6 Removendo variáveis

No R base, pode-se usar NULL ou subset. Veja os exemplos.

# removendo incidencia3
survey2$incidencia3 <- NULL
glimpse(survey2)
## Observations: 671
## Variables: 13
## $ campo       <dbl> 25, 25, 25, 25, 25, 26, 26, 26, 26, 36, 48, 49, 49...
## $ ano         <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 20...
## $ local       <chr> "Agua Santa", "Agua Santa", "Agua Santa", "Agua Sa...
## $ estado      <chr> "RS", "RS", "RS", "RS", "RS", "RS", "RS", "RS", "R...
## $ lat         <dbl> -28.30617, -28.30617, -28.28964, -28.28964, -28.28...
## $ long        <dbl> -52.08281, -52.08281, -51.97308, -51.97308, -51.97...
## $ residuo     <chr> "soybean", "soybean", "soybean", "soybean", "soybe...
## $ incidencia  <dbl> 68.24, 68.24, 68.24, 68.24, 68.24, 34.00, 34.00, 3...
## $ severidade  <dbl> 9.47, 9.47, 9.47, 9.47, 9.47, 3.73, 3.73, 3.73, 3....
## $ especie     <chr> "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "F...
## $ quimiotipo  <chr> "15-ADON", "15-ADON", "15-ADON", "15-ADON", "15-AD...
## $ index       <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,...
## $ incidencia2 <dbl> 0.6824, 0.6824, 0.6824, 0.6824, 0.6824, 0.3400, 0....
# removendo incidencia2 com a função subset
survey2 <- subset(survey2, select = c(-incidencia2))
glimpse(survey2)
## Observations: 671
## Variables: 12
## $ campo      <dbl> 25, 25, 25, 25, 25, 26, 26, 26, 26, 36, 48, 49, 49,...
## $ ano        <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 201...
## $ local      <chr> "Agua Santa", "Agua Santa", "Agua Santa", "Agua San...
## $ estado     <chr> "RS", "RS", "RS", "RS", "RS", "RS", "RS", "RS", "RS...
## $ lat        <dbl> -28.30617, -28.30617, -28.28964, -28.28964, -28.289...
## $ long       <dbl> -52.08281, -52.08281, -51.97308, -51.97308, -51.973...
## $ residuo    <chr> "soybean", "soybean", "soybean", "soybean", "soybea...
## $ incidencia <dbl> 68.24, 68.24, 68.24, 68.24, 68.24, 34.00, 34.00, 34...
## $ severidade <dbl> 9.47, 9.47, 9.47, 9.47, 9.47, 3.73, 3.73, 3.73, 3.7...
## $ especie    <chr> "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fgra", "Fg...
## $ quimiotipo <chr> "15-ADON", "15-ADON", "15-ADON", "15-ADON", "15-ADO...
## $ index      <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, ...

4.7 Reordenando as linhas

No pacote dplyr, a função arrange pode ser usada para reordenação.

# reordena pelo ano
survey2 <- arrange(survey2, ano)
head(survey2$ano, 20)
##  [1] 2009 2009 2009 2009 2009 2009 2009 2009 2009 2009 2009 2009 2009 2009
## [15] 2009 2009 2009 2009 2009 2009
tail(survey2$ano, 20)
##  [1] 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011 2011
## [15] 2011 2011 2011 2011 2011 2011
# reordena pelo valor de severidade
survey2 <- arrange(survey2, severidade)
head(survey2$severidade, 20)
##  [1] 0.00 0.00 0.00 0.02 0.03 0.03 0.03 0.03 0.03 0.05 0.07 0.07 0.07 0.07
## [15] 0.09 0.09 0.09 0.09 0.09 0.09
# veja o resultado
arrange(survey2, -incidencia)
## # A tibble: 671 x 12
##    campo   ano local estado   lat  long residuo incidencia severidade
##    <dbl> <dbl> <chr> <chr>  <dbl> <dbl> <chr>        <dbl>      <dbl>
##  1    15  2009 Palm~ RS     -27.8 -53.4 corn          90.0      18.5 
##  2    15  2009 Palm~ RS     -27.8 -53.4 corn          90.0      18.5 
##  3    15  2009 Palm~ RS     -27.8 -53.4 corn          90.0      18.5 
##  4     2  2010 Cara~ RS     -28.3 -52.7 soybean       72.5      14.3 
##  5     2  2010 Cara~ RS     -28.3 -52.8 soybean       72.5      14.3 
##  6     2  2010 Cara~ RS     -28.3 -52.8 soybean       72.5      14.3 
##  7     2  2010 Cara~ RS     -28.3 -52.8 soybean       72.5      14.3 
##  8    24  2009 Lage~ RS     -28.1 -52.2 soybean       71         5.22
##  9    24  2009 Lage~ RS     -28.1 -52.2 soybean       71         5.22
## 10     6  2010 Cara~ RS     -28.3 -51.7 soybean       70.7       8.13
## # ... with 661 more rows, and 3 more variables: especie <chr>,
## #   quimiotipo <chr>, index <int>

4.8 Encontrar duplicatas

Para encontrar registros únicos ou duplicados no data frame usa-se a função unique e duplicate.

unique(survey3) # acha linhas únicas
## # A tibble: 213 x 3
##    field location            species
##    <dbl> <chr>               <chr>  
##  1    25 Agua Santa          Fgra   
##  2    26 Agua Santa          Fgra   
##  3    26 Agua Santa          Fmer   
##  4    36 Agua Santa          Fgra   
##  5    48 Antonio Prado       Fcor   
##  6    49 Antonio Prado       Fgra   
##  7    NA Apucarana           Fgra   
##  8    NA Apucarana           Fmer   
##  9    NA Arapongas           Fgra   
## 10    NA Assis Chateaubriand Fmer   
## # ... with 203 more rows
head(duplicated(survey3), 10) # verifica se é a linha tem dupla entrada
##  [1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE FALSE
# note que aqui é uma função de lógica

count(duplicated(survey3)) # conta o número de linhas duplicadas
##       x freq
## 1 FALSE  213
## 2  TRUE  458

4.9 Renomeando níveis

Muitas vezes queremos substituir o nome dos níveis de um fator, sem a necessidade de retornar à planilha eletrônica. No exemplo, vamos alterar o nome das espécies que está com a codificação (Fgra, Fmer, etc) para o nome binomial latino. Para isso, vamos usar a função revalue do pacote plyr.

survey2$especie <- revalue(survey2$especie, c("Fgra" = "Fusarium graminearum"))

4.10 Salvando arquivo

Depois de se ter manipulado o conjunto de dados, pode-se salvar o data frame e formato de planilha eletrônica, sendo os mais comuns em formato txt ou csv. No pacote utils do R que é carregado automatica, a função write.csv permite salvar no arquivo externo.

# vamos criar o arquivo survey22.csv
write.csv(survey2, file = "survey22.csv")

O arquivo csv pode ser aberto em qualquer programa de planilha eletrônica. No entanto, pode-se optar por salvar diretamente no formato xlsx do Excel. Para isso, carrega-se o pacote openxlsx.

#library(openxlsx)
#write.xlsx(survey2, file = "survey222.xlsx")

4.11 Transposição

Usualmente, várias funções do R seja para estatísticas ou visualização de dados exigem que os dados se apresentem da seguinte forma: cada observação é uma linha e cada coluna é uma variável. É o chamado conjunto na forma “tidy”, ou arrumado, em português.

As vezes recebemos dados em que as observações se encontram em várias colunas quando há a interação com outras variáveis. Por exemplo, uma variável é analisada em vários tempos, mas o tempo está como uma variável na coluna e não com uma entrada única para cada tempo. Nesse caso, pode ser necessário fazer a transposição ou “arrumação” do conjunto de colunas para linhas. Vamos usar alguns pacotes do R para fazer essa transposição como o tidy e o reshape2.

Vamos trabalhar com o conjunto “ralstonia” do pacote agricolae, o qual contém a contagem de colônias (log(1+UFC/g solo)) em placas de petri.

# Carrega o arquivo de dados ralstonia do pacote agricolae
library (agricolae)
data(ralstonia)

# verifica as colunas do conjunto
colnames(ralstonia)
## [1] "place"  "Day2"   "Day15"  "Day29"  "Day43"  "Day58"  "Day73"  "Day133"
head(ralstonia)
##    place  Day2 Day15 Day29 Day43 Day58 Day73 Day133
## 1 Namora 7.509 7.552 6.541 6.390 6.214 5.863  4.838
## 2   Hyo1 7.398 6.720 3.388 1.657 0.000 0.000  0.000
## 3   Hyo2 7.399 6.118 2.195 0.000 0.000 0.000  0.000
## 4    SR1 7.418 6.857 6.800 6.508 6.523 6.250  5.451
## 5    SR2 7.325 7.414 7.221 7.005 6.937 6.777  6.437
## 6   Cnt1 7.301 7.025 5.992 3.669 2.104 0.000  0.000

No pacote reshape2 vamos utilizar a função melt para fazer a transposição de colunas para linhas.

library(reshape2)
# usa-se a função melt do pacote reshape2
ralstonia2 <- melt(ralstonia, id=c("place"), 
     variable.name="days", value.name="count")

No pacote tidyr podemos usar a função gather para o mesmo resultado, porém com muito menos esforço.

library(tidyr)
## 
## Attaching package: 'tidyr'
## The following object is masked from 'package:reshape2':
## 
##     smiths
ralstonia3 <- gather(ralstonia, "day", "count", 2:8)

Nós podemos fazer o inverso pois, em alguns casos podemos trabalhar com os dados me formatos de uma matriz ou no formato “largo”. A função spread do pacote tidyr facilita essa operação.

# usando a função spread do tidyr: mais simples!
ralstonia_largo <-  spread(ralstonia3, day, count)
head(ralstonia_largo)
##   place Day133 Day15  Day2 Day29 Day43 Day58 Day73
## 1 Chmar  5.132 7.552 7.420 6.037 5.835 5.396 5.210
## 2   Chz  5.037 7.381 7.347 6.856 6.705 6.469 5.959
## 3  Cnt1  0.000 7.025 7.301 5.992 3.669 2.104 0.000
## 4  Cnt2  0.000 6.428 7.287 2.195 0.000 0.000 0.000
## 5  Cnt3  0.000 4.461 7.019 0.000 0.000 0.000 0.000
## 6  Hco1  5.595 7.703 7.681 7.093 6.974 6.440 6.365
# ou usando a função dcast do reshape2 - mais trabalhoso!
ralstonia_largo2 <- dcast(ralstonia3, place ~ day, value.var="count")