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")