Na primeira parte desse módulo, abordamos os cuidados básicos para a criação de bases de dados de maneira que as mesmas possuam características de uso universal (ou quase) e que facilitem a sua utilização para a análise de dados.
Após abordarmos esses temas, é o momento de aplicarmos esse conhecimento na importação e edição de bases de dados no R.
Antes de iniciarmos a importação de alguma base de dados, é interessante que alguns conceitos sejam abordados novamente. O principal conceito a ser abordado, nesse momento, é o de diretório de trabalho (work directory). O diretório de trabalho é um conceito utilizado no R, que caracteriza o diretório onde todos os arquivos utilizados para input e os arquivos de output deverão estar alocados (a menos que alguma informação adicional seja repassada ao software). Neste material suplementar daremos prioridade à discussão dos comandos utilizados no script ou terminal para obter informações sobre o diretório de trabalho. Contudo, é importante ressaltar que o R Studio possui opções semelhantes em seus menus de point-and-click.
Os primeiros dois comandos a serem apresentados serão os comandos getwd() e dir().
O comando getwd() (get work directory) é responsável por apresentar ao usuário qual é o diretório de trabalho que está selecionado. O comando abaixo apresenta como essa função é utilizada.
getwd()
## [1] "E:/Doutorado/curso_R/Aula3"
Note que para a execução dessa função, somente é necessário informar o comando sem nenhum argumento. O output dessa função é o caminho completo para o diretório que está determinado como sendo o diretório de trabalho atual.
O comando dir() (directory) é responsável por listar todos os arquivos contidos no diretório de trabalho atual.
dir()
## [1] "Curso Introdução ao R_ Manipulação de dados e aplicações (Módulo 3 - pt 1 ).avi"
## [2] "Curso Introdução ao R_ Manipulação de dados e aplicações (Módulo 3 - pt 1 ).mp4"
## [3] "Curso R - Modulo 3 - pt 1 - Trnasmissão retomada.avi"
## [4] "Curso R - Modulo 3 - pt 1 - Trnasmissão retomada.mp4"
## [5] "CursoR_aula3_pt2.html"
## [6] "CursoR_aula3_pt2.pdf"
## [7] "CursoR_aula3_pt2.Rmd"
## [8] "CursoR_aula3_pt2_FEH.Rmd"
## [9] "CursoR_aula3_pt2_Final.html"
## [10] "CursoR_aula3_pt2_Final.pdf"
## [11] "CursoR_aula3_pt2_Final.Rmd"
## [12] "CursoR_exercicios_modulo3.Rmd"
## [13] "CursoR_modulo2_aula1.pdf:Zone.Identifier"
## [14] "CursoR_modulo3_aula1.pdf"
## [15] "CursoR_modulo3_aula1.pptx"
## [16] "CursoR_modulo3_aula1.pptx:Zone.Identifier"
## [17] "CursoR_modulo3_aula1_edited.avi"
## [18] "erro1.PNG"
## [19] "exemplo_erro1.txt"
## [20] "exemplo_missing.txt"
## [21] "exercicio_modulo3"
## [22] "exercicio_modulo3_comRespostas.html"
## [23] "exercicio_modulo3_comRespostas.Rmd"
## [24] "exercicio_modulo3_semRespostas.html"
## [25] "exercicio_modulo3_semRespostas.Rmd"
## [26] "exercicios_entregues_modulo3"
## [27] "input_mtcars_cursoR_10_11_17.txt"
## [28] "input_mtcars_cursoR_cabecalho_numerico_10_11_17.txt"
## [29] "input_mtcars_cursoR_EDITADO_10_11_17.txt"
## [30] "selecao_pathway.png"
Note que para a execução dessa função, assim como na anterior, somente é necessário informar o comando sem nenhum argumento. O output dessa função é um vetor com os nomes de todos os arquivos contidos no diretório de trabalho.
A estutura de caminho para o diretório de trabalho apresentada como output da função getwd() pode ser utilizada para modificarmos o comportamento das funções. Por exemplo, no caso da função dir() podemos informar uma diretório diferente ao diretório de trabalho para que sejam mostrados os arquivos contidos neste diretório.
dir("E:/Doutorado/curso_R")
## [1] "~$enta_cursoR_LND.docx"
## [2] "~$onograma_CursoR.docx"
## [3] "Aula1"
## [4] "Aula2"
## [5] "Aula3"
## [6] "Aula4"
## [7] "Aula5"
## [8] "Cronograma_CursoR.docx"
## [9] "Ementa_cursoR_LND.docx"
## [10] "Ementa_cursoR_LND.docx:Zone.Identifier"
## [11] "exeplo_plot_aula1.pdf"
Com este comando, informamos ao software que gostaríamos que fosse mostrado o nome dos arquivos contidos no diretório curso_R, diretório esse contido dentro de um outro diretório chamado Doutorado.
OBS: Note que o caminho para o diretório curso_R foi informado entre aspas duplas. Como discutido no módulo 2, isso deve ser feito de modo a informar para o R que toda a sequência de caracteres informada não se trata de objetos criados no sistema.
A maneira mais simples de se obter o caminho para um diretório no Windows é através da obtenção direta por meio da janela do sistema onde o diretório está contido. Observe a figura abaixo:
Figura 1: Obtenção do caminho completo do diretório por meio das janelas de navegação do Windows.
É importante ressaltar que quando o caminho completo é obtido como mostrado na Figura 1, existe um pequeno problema. Caso você tente utilizar o caminho exatamente como copiado da janela de navegação do Windows, uma mensagem de erro será informada.
dir("E:\Doutorado\curso_R")
## Error: '\D' é uma seqüência de escape não reconhecida na cadeia de caracteres começando com ""E:\D"
Note que esta mensagem de erro está relacionada com a presença da barra invertida (“") na descrição do caminho completo para o diretório. Portanto, toda vez que um caminho para um diretório for copiado diretamente do Windows para o R, esse pequeno problema deve ser resolvido. Isso pode ser feito utilizando a barra no sentido convencional (”/“), como mostrado nos exemplos anteriores ou duplicando a barra invertida no caminho para o diretório. Por exemplo:
dir("E:\\Doutorado\\curso_R")
## [1] "~$enta_cursoR_LND.docx"
## [2] "~$onograma_CursoR.docx"
## [3] "Aula1"
## [4] "Aula2"
## [5] "Aula3"
## [6] "Aula4"
## [7] "Aula5"
## [8] "Cronograma_CursoR.docx"
## [9] "Ementa_cursoR_LND.docx"
## [10] "Ementa_cursoR_LND.docx:Zone.Identifier"
## [11] "exeplo_plot_aula1.pdf"
Agora que sabemos como identificar o diretório de trabalho atual, precisamos aprender como alterar o diretório de trabalho. Em alguns dos códigos que iremos escrever, podemos ter a necessidade de trabalhar com múltiplos diretórios de trabalho.
O comando utilizado para alterar os diretórios de trabalho no R é setwd() (“set work directory”).
#Verificando o diretório de trabalho atual
getwd()
## [1] "E:/Doutorado/curso_R/Aula3"
#Alterando o diretório de trabalho para o diretório curso_R
setwd("E:/Doutorado/curso_R")
#Verificando o novo diretório de trabalho
getwd()
## [1] "E:/Doutorado/curso_R"
#Verificando o conteúdo de curso_R
dir()
## [1] "~$enta_cursoR_LND.docx"
## [2] "~$onograma_CursoR.docx"
## [3] "Aula1"
## [4] "Aula2"
## [5] "Aula3"
## [6] "Aula4"
## [7] "Aula5"
## [8] "Cronograma_CursoR.docx"
## [9] "Ementa_cursoR_LND.docx"
## [10] "Ementa_cursoR_LND.docx:Zone.Identifier"
## [11] "exeplo_plot_aula1.pdf"
Na sequência de comandos acima, verificamos o diretório de trabalho que estava sendo utilizado inicialmente. Em seguida, com o uso da função setwd() alteramos o diretório de trabalho para o diretório curso_R. Por último, verificamos o conteúdo do diretório curso_R com a função dir().
Todos os comandos descritos acima são muito úteis e usados rotineiramente na importação de arquivos no R e armazenamento de outputs no computador.
Nas aulas anteriores utilizamos o conjunto de dados mtcars para exemplificar a estrutura de Data frames no R. Nessa aula, continuaremos a utilizá-lo. Contudo, nesta aula iremos importar o arquivo contido na pasta do curso que é uma cópia exata desse conjunto de dados salva no formato “.txt”.
OBS: Como mostrado na aula anterior, várias opções são possíveis de serem utilizadas no momento de se salvar arquivos no formato “.txt”. Os exemplos a seguir serão construídos levando-se em consideração que estamos trabalhando com um arquivo que utiliza tabulação (“”) como separador dos campos, e que possui cabeçalho (header). Apesar disso, as opções para alterar essas características serão descritas ao longo da aula.
Primeiramente iremos identificar o nome do arquivo contido na pasta Aula3. Para isso, usaremos a função dir().
getwd()
## [1] "E:/Doutorado/curso_R/Aula3"
dir()
## [1] "Curso Introdução ao R_ Manipulação de dados e aplicações (Módulo 3 - pt 1 ).avi"
## [2] "Curso Introdução ao R_ Manipulação de dados e aplicações (Módulo 3 - pt 1 ).mp4"
## [3] "Curso R - Modulo 3 - pt 1 - Trnasmissão retomada.avi"
## [4] "Curso R - Modulo 3 - pt 1 - Trnasmissão retomada.mp4"
## [5] "CursoR_aula3_pt2.html"
## [6] "CursoR_aula3_pt2.pdf"
## [7] "CursoR_aula3_pt2.Rmd"
## [8] "CursoR_aula3_pt2_FEH.Rmd"
## [9] "CursoR_aula3_pt2_Final.html"
## [10] "CursoR_aula3_pt2_Final.pdf"
## [11] "CursoR_aula3_pt2_Final.Rmd"
## [12] "CursoR_exercicios_modulo3.Rmd"
## [13] "CursoR_modulo2_aula1.pdf:Zone.Identifier"
## [14] "CursoR_modulo3_aula1.pdf"
## [15] "CursoR_modulo3_aula1.pptx"
## [16] "CursoR_modulo3_aula1.pptx:Zone.Identifier"
## [17] "CursoR_modulo3_aula1_edited.avi"
## [18] "erro1.PNG"
## [19] "exemplo_erro1.txt"
## [20] "exemplo_missing.txt"
## [21] "exercicio_modulo3"
## [22] "exercicio_modulo3_comRespostas.html"
## [23] "exercicio_modulo3_comRespostas.Rmd"
## [24] "exercicio_modulo3_semRespostas.html"
## [25] "exercicio_modulo3_semRespostas.Rmd"
## [26] "exercicios_entregues_modulo3"
## [27] "input_mtcars_cursoR_10_11_17.txt"
## [28] "input_mtcars_cursoR_cabecalho_numerico_10_11_17.txt"
## [29] "input_mtcars_cursoR_EDITADO_10_11_17.txt"
## [30] "selecao_pathway.png"
O arquivo que iremos utilizar está localizado na pasta Aula3 e nomeado como “input_mtcars_cursoR_10_11_17.txt”.
Agora, iremos fazer o upload do arquivo no R. Para isso, utilizaremos a função read.table(). A função read.table() é uma função nativa do R e funciona de uma maneira muito simples e bem abrangente. Por isso iremos usá-la como nossa função base para a importação de arquivos tabulares no R. Contudo, existem outras funções como read.csv(), read.csv2() e odbcConnectExcel(). Essa última função está presente um um pacote adicional que pode ser instalado no R, o pacote RODBC.
OBS: Nesse curso iremos focar na importação de arquivos contidos no computador. Contudo, é possível importar arquivos tabulares diretamente de sites e data bases da internet informando o endereço das mesmas.
#Importanto o arquivo tabular para o R
mtcars_data<-read.table(file="input_mtcars_cursoR_10_11_17.txt",h=T, sep="\t")
A função read.table() possui alguns argumentos que precisam ser informados. No caso mostrado acima, os argumentos utilizados foram: file=, h= e sep=.
O argumento file= é responsável por informar à função o nome do arquivo a ser importado. Note que nesse caso, pelo fato do arquivo estar contido no diretório de trabalho, precisamos somente informar o nome do mesmo. Contudo, caso desejássemos importar um arquivo presente em um diretório distinto ao diretório de trabalho, precisaríamos informar todo o caminho do arquivo. Como esse arquivo que está contido no diretório Aula3, esse caminho seria: “E:/Doutorado/curso_R/Aula3/input_mtcars_cursoR_10_11_17.txt”. Detalhe importante, esse caminho completo é referente ao caminho do computador onde este material foi escrito. Portanto, essa sequência de diretórios pode mudar em cada um dos computadores de vocês.
O argumento h=, que também pode ser representado por header=, é um argumento que recebe uma resposta lógica (TRUE ou FALSE). Esse argumento informa à função se o arquivo que está sendo importado contém um cabeçalho ou não. No caso do arquivo que utilizaremos como exemplo, o mesmo possui um cabeçalho. Portanto, a resposta lógica TRUE foi repassada ao argumento.
O último argumento informado à função foi sep=. Esse argumento informa à função qual é o separador de campos utilizado. No caso do arquivo utilizado, o separador é feito por tabulações. O símbolo utilizado para representar tabulações é “”. Caso desejássemos importar um arquivo contendo outra classe de separador, como vírgula, poderíamos simplesmente mudar esse símbolo no argumento sep=. No caso da vírgular, usaríamos “,”. A opção padrão do programa é a separação por espaço. Portanto, caso o argumento sep= não seja informado, o R irá considerar que o arquivo é separado por espaço.
Importante: Nesse módulo não revisaremos a manipulação de objetos em Data frames. O processo para a manipulação de objetos para tabelas construídas dentro do ambiente e importadas para o ambiente é o mesmo. Nesse módulo abordaremos outras funções e opções de manipulação em Data frames.
Antes de iniciarmos qualquer procedimento com o arquivo importato no R, é sempre importante conferir se o mesmo foi importado de maneira correta. Para isso, podemos usar uma série de funções. Dentre elas, estão as funções head(), str() e dim().
#Verificando as seis primeiras linhas da Data frame importada
head(mtcars_data)
## mpg cyl disp hp drat wt qsec vs am gear carb model
## 1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4
## 2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag
## 3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Datsun 710
## 4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet 4 Drive
## 5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Hornet Sportabout
## 6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 Valiant
#Verificando a estrutura da Data frame importada
str(mtcars_data)
## 'data.frame': 32 obs. of 12 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ...
## $ disp : num 160 160 108 258 360 ...
## $ hp : int 110 110 93 110 175 105 245 62 95 123 ...
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec : num 16.5 17 18.6 19.4 17 ...
## $ vs : int 0 0 1 1 0 1 0 1 1 1 ...
## $ am : int 1 1 1 0 0 0 0 0 0 0 ...
## $ gear : int 4 4 4 3 3 3 3 4 4 4 ...
## $ carb : int 4 4 1 1 2 1 4 2 2 4 ...
## $ model: Factor w/ 32 levels "AMC Javelin",..: 18 19 5 13 14 31 7 21 20 22 ...
#Verificando as dimensões da Data frame importada
dim(mtcars_data)
## [1] 32 12
Note que head() e str() são funções boas de se utilizar quando você não conhece a estrutura geral da Data frame (apesar de que é de grande importância conhecer a estrutura do seu dado antes de iniciar a análise). Já no caso da função dim(), você precisa conhecer o número de linhas e colunas do seu arquivo, uma vez que o output dessa função é exatamente constituído por esses números, nessa mesma sequência (número de linhas e número de colunas).
O primeiro grupo de funções para a exploração de data frames que serão abordadas a partir de agora será formado pelas funções names(), rownames() e colnames().
#Executando a função names
names(mtcars_data)
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs"
## [9] "am" "gear" "carb" "model"
#Executando a função rownames
rownames(mtcars_data)
## [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14"
## [15] "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28"
## [29] "29" "30" "31" "32"
#Executando a função colnames
colnames(mtcars_data)
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs"
## [9] "am" "gear" "carb" "model"
Primeiramente, note que as funções names() e colnames() tiveram o mesmo resultado. Ambas produziram um vetor contendo os nomes das colunas da Data frame mtcars. A função names() pode ser aplicada a praticamente qualquer objeto no R e irá retornar os nomes associados aos valores contidos em um objeto. Em Data frames, names() retorna o nome das colunas. Já a função colnames(), como é de se esperar, sempre retornará um vetor com o nome das colunas da Data frame. Lembre-se de que essas funções retornam vetores contendo os nomes das colunas da Data frame, isso será muito útil logo em seguida.
Já a função rownames() como também era esperado, retornou um vetor contendo o nome das linhas. Contudo, se vocês voltarem no output da função head() irão notar que a nossa Data frame não possui nomes próprios para as linhas, ao invés disso, as linhas estão nomeadas pela posição das mesmas, sendo assim nomeadas de 1 a 32.
Como dito anteriormente, essas funções retornam vetores contendo os nomes de linhas e colunas da Data frame. Essa é uma característica muito importante, uma vez que vetores podem ser facilmente manipulados no R. Portanto, utilizando as características de manipulação de vetores, assim como os resultados dessas funções, somos capazes de alterar os nomes das linhas e colunas presentes nas Data frames.
Desta forma, aproveitando dessas funcionalidades, vamos inserir nomes próprios às linhas da Data frame mtcars. Para isso, iremos aplicar os conceitos de namipulação de vetores já aprendidos nesse curso.
#Conferindo as seis primeiras linhas de mtcars e confirmando que não existem nomes para as linhas
head(mtcars_data)
## mpg cyl disp hp drat wt qsec vs am gear carb model
## 1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 Mazda RX4
## 2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 Mazda RX4 Wag
## 3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 Datsun 710
## 4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet 4 Drive
## 5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 Hornet Sportabout
## 6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 Valiant
#Inserindo novos nomes nas linhas de mtcars baseado nos nomes contidos na coluna models
rownames(mtcars_data)<-mtcars_data$model
#Verificando se o nome das linhas de mtcars foi atualizado
head(mtcars_data)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
## model
## Mazda RX4 Mazda RX4
## Mazda RX4 Wag Mazda RX4 Wag
## Datsun 710 Datsun 710
## Hornet 4 Drive Hornet 4 Drive
## Hornet Sportabout Hornet Sportabout
## Valiant Valiant
Como podemos notar, a partir de agora, mtcars_data possui nomes para as linhas. É importante ressaltar que os nomes das linhas não são tratados como uma coluna. Eles são um espaço independente, fora da estrutura da Data Frame. Uma vez que já temos a informação do modelo de cada carro contida no nome das linhas, podemos eliminar a coluna “model” de nossa Data frame. Para isso, vamos executar o seguinte comando:
#Eliminando a coluna model
mtcars_data<-mtcars_data[,-12]
#Verificando a nova Data frame
head(mtcars_data)
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
Uma outra possibilidade da utilização conjunta da manipulação de objetos e as funções descritas acima, é a renomeação de alguma linha ou coluna específica. Por exemplo, na Data frame mtcars_data, possuímos a coluna “hp”, essa coluna se refere aos cavalos de força (horse power) que cada um dos carros possui. O nome “hp” pode ser pouco descritivo e de difícil associação, portanto, vamos substituí-lo por “horsepower”.
#Primeiramente devemos identificar a posição referente à coluna "hp"
colnames(mtcars_data)
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
#Uma vez identificado, devemos informar o index do elemento que queros substituir
colnames(mtcars_data)[4]<-"horsepower"
#Verificando a nova nomenclatura
head(mtcars_data)
## mpg cyl disp horsepower drat wt qsec vs am gear
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3
## carb
## Mazda RX4 4
## Mazda RX4 Wag 4
## Datsun 710 1
## Hornet 4 Drive 1
## Hornet Sportabout 2
## Valiant 1
Note os passos necessários para realizar a mudança de nome da coluna especificada. Primeiro devemos saber o index (posição) da coluna. Uma vez identificado que o index da coluna “hp” é o 4, devemos informar que queremos inserir o nome “horsepower” no index 4 do vetor gerado pela função colnames(). Lembrando que o nome deve ser cercado por aspas duplas para que o R não interprete este nome como um objeto. Abaixo, iremos isolar o comando “colnames(mtcars_data)[4]”. Assim, vocês serão capazes de reparar que agora, o nome presente no index 4 desse vetor é a palavra “horsepower”.
#Isolando o elemento 4 do vetor gerado por colnames()
colnames(mtcars_data)[4]
## [1] "horsepower"
Isso pode ser feito para qualquer posição. Note que você não pode informar indexes que excedam o número de linhas ou colunas presentes na Data frame, caso contrário, uma mensagem de erro será informada.
DICA: Procure alterar o exemplo anterior de modo a substituir o nome de outras colunas e linhas.
Uma funcionalidade muito interessante para a aplicação em Data frames é a alteração da posição de linhas e colunas. Isso pode ser feito simplesmente alterando os indexes dos elementos dentro da estrutura de indexação da Data frame. Veja o exemplo abaixo:
#Visualizando as seis primeiras linhas da Data frame
head(mtcars_data)
## mpg cyl disp horsepower drat wt qsec vs am gear
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3
## carb
## Mazda RX4 4
## Mazda RX4 Wag 4
## Datsun 710 1
## Hornet 4 Drive 1
## Hornet Sportabout 2
## Valiant 1
#Vamos alterar as posições de mpg e horsepower, primeira e quarta colunas, respectivamente
mtcars_data<- mtcars_data[,c(4,2,3,1,5:11)]
#Visualizando as seis primeiras linhas da Data frame alterada
head(mtcars_data)
## horsepower cyl disp mpg drat wt qsec vs am gear
## Mazda RX4 110 6 160 21.0 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 110 6 160 21.0 3.90 2.875 17.02 0 1 4
## Datsun 710 93 4 108 22.8 3.85 2.320 18.61 1 1 4
## Hornet 4 Drive 110 6 258 21.4 3.08 3.215 19.44 1 0 3
## Hornet Sportabout 175 8 360 18.7 3.15 3.440 17.02 0 0 3
## Valiant 105 6 225 18.1 2.76 3.460 20.22 1 0 3
## carb
## Mazda RX4 4
## Mazda RX4 Wag 4
## Datsun 710 1
## Hornet 4 Drive 1
## Hornet Sportabout 2
## Valiant 1
Note que com o comando acima fomos capazes de alterar as posições das coluas “mpg” e “horsepower”. Repare também que a posição das demais colunas não foi afetada. Como a troca envolveu somente as colunas 1 e 4, eu optei por utilizar a estrutura “5:11” para simbolizar que da quinta coluna até a última, não houve alteração.
No caso acima, o número de colunas já era sabido, uma vez que executamos a função dim() anteriormente. Porém, existem duas funções muito úteis para recuperarmos os números de linhas e colunas de uma Data frame. Essas funções são ncol() e nrow().
#Obtendo o número de colunas de mtcars_data
ncol(mtcars_data)
## [1] 11
#Obtendo o número de linhas de mtcars_data
nrow(mtcars_data)
## [1] 32
Uma outra atividade rotineiramente utilizada em análise de dados é a ordenação dos valores. Por meio da função order() podemos identificar a ordem crescente ou decrescente dos números contidos em um vetor. Lembre-se que colunas e linhas de uma Data frame comportam-se exatamente como vetores.
Para exemplificar como a função order() funciona, vamos criar o seguinte vetor e ordená-lo:
#Criando um vetor não ordenado, com 5 números (10 a 15)
vetorA<-c(14,12,11,15,10)
#Mostrando o conteúdo de vetorA antes da ordenação
vetorA
## [1] 14 12 11 15 10
#verificando o funcionamento da função order()
order(vetorA)
## [1] 5 3 2 1 4
#Ordenando vetorA em função do resultado de order()
vetorA<-vetorA[order(vetorA)]
#Mostrando o conteúdo de vetorA após ordenação
vetorA
## [1] 10 11 12 14 15
#Reordenando o vetor em ordem descrescente
vetorA<-vetorA[order(vetorA, decreasing = T)]
#Mostrando o vetor após a nova ordenação
vetorA
## [1] 15 14 12 11 10
Repare que o output da função order() não apresenta os números contidos em vetorA de maneira ordenada, mas sim o index dos números contidos em vetorA em sua ordem númerica crescente. Ou seja, o número 10 (o primeiro na ordem número crescente) é o elemento número 5 no vetor. Portanto, o primeiro número no output da função order() é o index 5. Combinando esse resultado com a indexação das posições utilizada para manipular vetores no R, podemos re-ordenar o vetorA. Note também que o padrão de ordenação da função é a ordem crescente. Contudo, também podemos ordenar os números em ordem decrescente. Para isso, só precisamos informar um argumento adicional à função order(). Esse argumento é o “decreasing=”. Esse argumento recebe uma resposta lógica que informará se a ordenação será feita de maneira decrescente ou não. O padrão dessa função é “FALSE”. Assim, os números são ordenados de maneira crescente. Caso “TRUE” seja informado a esse argumento, os elementos são ordenados de maneira decrescente.
Agora, vamos aplicar esse conceito às Data frames. Esse é um processo muito simples e semelhante ao mostrado logo acima, uma vez que linhas e colunas de Data frames funcionam como vetores no R. No exemplo abaixo, primeiro ordenaremos a Data frame mtcars em função da coluna “cyl”, de maneira crescente. Em seguida, a mesma coluna será ordenada de maneira descrescente.
#Visualizando as seis primeiras linhas de mtcars
head(mtcars_data)
## horsepower cyl disp mpg drat wt qsec vs am gear
## Mazda RX4 110 6 160 21.0 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 110 6 160 21.0 3.90 2.875 17.02 0 1 4
## Datsun 710 93 4 108 22.8 3.85 2.320 18.61 1 1 4
## Hornet 4 Drive 110 6 258 21.4 3.08 3.215 19.44 1 0 3
## Hornet Sportabout 175 8 360 18.7 3.15 3.440 17.02 0 0 3
## Valiant 105 6 225 18.1 2.76 3.460 20.22 1 0 3
## carb
## Mazda RX4 4
## Mazda RX4 Wag 4
## Datsun 710 1
## Hornet 4 Drive 1
## Hornet Sportabout 2
## Valiant 1
#Ordenando a Data frame de maneira crescente em função da coluna cyl
mtcars_data<-mtcars_data[order(mtcars_data$cyl),]
#verificando se a Data frame foi ordenada de maneira crescente em função da coluna cyl
mtcars_data
## horsepower cyl disp mpg drat wt qsec vs am gear
## Datsun 710 93 4 108.0 22.8 3.85 2.320 18.61 1 1 4
## Merc 240D 62 4 146.7 24.4 3.69 3.190 20.00 1 0 4
## Merc 230 95 4 140.8 22.8 3.92 3.150 22.90 1 0 4
## Fiat 128 66 4 78.7 32.4 4.08 2.200 19.47 1 1 4
## Honda Civic 52 4 75.7 30.4 4.93 1.615 18.52 1 1 4
## Toyota Corolla 65 4 71.1 33.9 4.22 1.835 19.90 1 1 4
## Toyota Corona 97 4 120.1 21.5 3.70 2.465 20.01 1 0 3
## Fiat X1-9 66 4 79.0 27.3 4.08 1.935 18.90 1 1 4
## Porsche 914-2 91 4 120.3 26.0 4.43 2.140 16.70 0 1 5
## Lotus Europa 113 4 95.1 30.4 3.77 1.513 16.90 1 1 5
## Volvo 142E 109 4 121.0 21.4 4.11 2.780 18.60 1 1 4
## Mazda RX4 110 6 160.0 21.0 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 110 6 160.0 21.0 3.90 2.875 17.02 0 1 4
## Hornet 4 Drive 110 6 258.0 21.4 3.08 3.215 19.44 1 0 3
## Valiant 105 6 225.0 18.1 2.76 3.460 20.22 1 0 3
## Merc 280 123 6 167.6 19.2 3.92 3.440 18.30 1 0 4
## Merc 280C 123 6 167.6 17.8 3.92 3.440 18.90 1 0 4
## Ferrari Dino 175 6 145.0 19.7 3.62 2.770 15.50 0 1 5
## Hornet Sportabout 175 8 360.0 18.7 3.15 3.440 17.02 0 0 3
## Duster 360 245 8 360.0 14.3 3.21 3.570 15.84 0 0 3
## Merc 450SE 180 8 275.8 16.4 3.07 4.070 17.40 0 0 3
## Merc 450SL 180 8 275.8 17.3 3.07 3.730 17.60 0 0 3
## Merc 450SLC 180 8 275.8 15.2 3.07 3.780 18.00 0 0 3
## Cadillac Fleetwood 205 8 472.0 10.4 2.93 5.250 17.98 0 0 3
## Lincoln Continental 215 8 460.0 10.4 3.00 5.424 17.82 0 0 3
## Chrysler Imperial 230 8 440.0 14.7 3.23 5.345 17.42 0 0 3
## Dodge Challenger 150 8 318.0 15.5 2.76 3.520 16.87 0 0 3
## AMC Javelin 150 8 304.0 15.2 3.15 3.435 17.30 0 0 3
## Camaro Z28 245 8 350.0 13.3 3.73 3.840 15.41 0 0 3
## Pontiac Firebird 175 8 400.0 19.2 3.08 3.845 17.05 0 0 3
## Ford Pantera L 264 8 351.0 15.8 4.22 3.170 14.50 0 1 5
## Maserati Bora 335 8 301.0 15.0 3.54 3.570 14.60 0 1 5
## carb
## Datsun 710 1
## Merc 240D 2
## Merc 230 2
## Fiat 128 1
## Honda Civic 2
## Toyota Corolla 1
## Toyota Corona 1
## Fiat X1-9 1
## Porsche 914-2 2
## Lotus Europa 2
## Volvo 142E 2
## Mazda RX4 4
## Mazda RX4 Wag 4
## Hornet 4 Drive 1
## Valiant 1
## Merc 280 4
## Merc 280C 4
## Ferrari Dino 6
## Hornet Sportabout 2
## Duster 360 4
## Merc 450SE 3
## Merc 450SL 3
## Merc 450SLC 3
## Cadillac Fleetwood 4
## Lincoln Continental 4
## Chrysler Imperial 4
## Dodge Challenger 2
## AMC Javelin 2
## Camaro Z28 4
## Pontiac Firebird 2
## Ford Pantera L 4
## Maserati Bora 8
#Ordenando a Data frame de maneira decrescente em função da coluna cyl
mtcars_data<-mtcars_data[order(mtcars_data$cyl,decreasing=T),]
#verificando se a Data frame foi ordenada de maneira decrescente em função da coluna cyl
mtcars_data
## horsepower cyl disp mpg drat wt qsec vs am gear
## Hornet Sportabout 175 8 360.0 18.7 3.15 3.440 17.02 0 0 3
## Duster 360 245 8 360.0 14.3 3.21 3.570 15.84 0 0 3
## Merc 450SE 180 8 275.8 16.4 3.07 4.070 17.40 0 0 3
## Merc 450SL 180 8 275.8 17.3 3.07 3.730 17.60 0 0 3
## Merc 450SLC 180 8 275.8 15.2 3.07 3.780 18.00 0 0 3
## Cadillac Fleetwood 205 8 472.0 10.4 2.93 5.250 17.98 0 0 3
## Lincoln Continental 215 8 460.0 10.4 3.00 5.424 17.82 0 0 3
## Chrysler Imperial 230 8 440.0 14.7 3.23 5.345 17.42 0 0 3
## Dodge Challenger 150 8 318.0 15.5 2.76 3.520 16.87 0 0 3
## AMC Javelin 150 8 304.0 15.2 3.15 3.435 17.30 0 0 3
## Camaro Z28 245 8 350.0 13.3 3.73 3.840 15.41 0 0 3
## Pontiac Firebird 175 8 400.0 19.2 3.08 3.845 17.05 0 0 3
## Ford Pantera L 264 8 351.0 15.8 4.22 3.170 14.50 0 1 5
## Maserati Bora 335 8 301.0 15.0 3.54 3.570 14.60 0 1 5
## Mazda RX4 110 6 160.0 21.0 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 110 6 160.0 21.0 3.90 2.875 17.02 0 1 4
## Hornet 4 Drive 110 6 258.0 21.4 3.08 3.215 19.44 1 0 3
## Valiant 105 6 225.0 18.1 2.76 3.460 20.22 1 0 3
## Merc 280 123 6 167.6 19.2 3.92 3.440 18.30 1 0 4
## Merc 280C 123 6 167.6 17.8 3.92 3.440 18.90 1 0 4
## Ferrari Dino 175 6 145.0 19.7 3.62 2.770 15.50 0 1 5
## Datsun 710 93 4 108.0 22.8 3.85 2.320 18.61 1 1 4
## Merc 240D 62 4 146.7 24.4 3.69 3.190 20.00 1 0 4
## Merc 230 95 4 140.8 22.8 3.92 3.150 22.90 1 0 4
## Fiat 128 66 4 78.7 32.4 4.08 2.200 19.47 1 1 4
## Honda Civic 52 4 75.7 30.4 4.93 1.615 18.52 1 1 4
## Toyota Corolla 65 4 71.1 33.9 4.22 1.835 19.90 1 1 4
## Toyota Corona 97 4 120.1 21.5 3.70 2.465 20.01 1 0 3
## Fiat X1-9 66 4 79.0 27.3 4.08 1.935 18.90 1 1 4
## Porsche 914-2 91 4 120.3 26.0 4.43 2.140 16.70 0 1 5
## Lotus Europa 113 4 95.1 30.4 3.77 1.513 16.90 1 1 5
## Volvo 142E 109 4 121.0 21.4 4.11 2.780 18.60 1 1 4
## carb
## Hornet Sportabout 2
## Duster 360 4
## Merc 450SE 3
## Merc 450SL 3
## Merc 450SLC 3
## Cadillac Fleetwood 4
## Lincoln Continental 4
## Chrysler Imperial 4
## Dodge Challenger 2
## AMC Javelin 2
## Camaro Z28 4
## Pontiac Firebird 2
## Ford Pantera L 4
## Maserati Bora 8
## Mazda RX4 4
## Mazda RX4 Wag 4
## Hornet 4 Drive 1
## Valiant 1
## Merc 280 4
## Merc 280C 4
## Ferrari Dino 6
## Datsun 710 1
## Merc 240D 2
## Merc 230 2
## Fiat 128 1
## Honda Civic 2
## Toyota Corolla 1
## Toyota Corona 1
## Fiat X1-9 1
## Porsche 914-2 2
## Lotus Europa 2
## Volvo 142E 2
Note que a função order() foi utilizada no espaço referente à indexação das linhas na Data frame, à esquerda da vírgula dentro dos colchetes. Isso acontece de maneira lógica, uma vez que queremos ordenar as linhas da coluna em função do conteúdo presente em uma das colunas.
DICA: É possível realizar a ordenação da Data frame utilizando a função order() baseando-se em mais de uma coluna. Para isso, é necessário somente informar a segunda coluna dentro dos parênteses da função order(). Por exemplo, caso quiséssemos ordenar a Data frame em função das colunas “cyl” e “gear”, poderíamos alterar os argumentos da função order() para:
#Ordenando a Data frame de maneira crescente em função das colunas cyl e gear
mtcars_data<-mtcars_data[order(mtcars_data$cyl, mtcars_data$gear),]
#verificando se a Data frame foi ordenada de maneira crescente em função das colunas cyl e gear
mtcars_data
## horsepower cyl disp mpg drat wt qsec vs am gear
## Toyota Corona 97 4 120.1 21.5 3.70 2.465 20.01 1 0 3
## Datsun 710 93 4 108.0 22.8 3.85 2.320 18.61 1 1 4
## Merc 240D 62 4 146.7 24.4 3.69 3.190 20.00 1 0 4
## Merc 230 95 4 140.8 22.8 3.92 3.150 22.90 1 0 4
## Fiat 128 66 4 78.7 32.4 4.08 2.200 19.47 1 1 4
## Honda Civic 52 4 75.7 30.4 4.93 1.615 18.52 1 1 4
## Toyota Corolla 65 4 71.1 33.9 4.22 1.835 19.90 1 1 4
## Fiat X1-9 66 4 79.0 27.3 4.08 1.935 18.90 1 1 4
## Volvo 142E 109 4 121.0 21.4 4.11 2.780 18.60 1 1 4
## Porsche 914-2 91 4 120.3 26.0 4.43 2.140 16.70 0 1 5
## Lotus Europa 113 4 95.1 30.4 3.77 1.513 16.90 1 1 5
## Hornet 4 Drive 110 6 258.0 21.4 3.08 3.215 19.44 1 0 3
## Valiant 105 6 225.0 18.1 2.76 3.460 20.22 1 0 3
## Mazda RX4 110 6 160.0 21.0 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 110 6 160.0 21.0 3.90 2.875 17.02 0 1 4
## Merc 280 123 6 167.6 19.2 3.92 3.440 18.30 1 0 4
## Merc 280C 123 6 167.6 17.8 3.92 3.440 18.90 1 0 4
## Ferrari Dino 175 6 145.0 19.7 3.62 2.770 15.50 0 1 5
## Hornet Sportabout 175 8 360.0 18.7 3.15 3.440 17.02 0 0 3
## Duster 360 245 8 360.0 14.3 3.21 3.570 15.84 0 0 3
## Merc 450SE 180 8 275.8 16.4 3.07 4.070 17.40 0 0 3
## Merc 450SL 180 8 275.8 17.3 3.07 3.730 17.60 0 0 3
## Merc 450SLC 180 8 275.8 15.2 3.07 3.780 18.00 0 0 3
## Cadillac Fleetwood 205 8 472.0 10.4 2.93 5.250 17.98 0 0 3
## Lincoln Continental 215 8 460.0 10.4 3.00 5.424 17.82 0 0 3
## Chrysler Imperial 230 8 440.0 14.7 3.23 5.345 17.42 0 0 3
## Dodge Challenger 150 8 318.0 15.5 2.76 3.520 16.87 0 0 3
## AMC Javelin 150 8 304.0 15.2 3.15 3.435 17.30 0 0 3
## Camaro Z28 245 8 350.0 13.3 3.73 3.840 15.41 0 0 3
## Pontiac Firebird 175 8 400.0 19.2 3.08 3.845 17.05 0 0 3
## Ford Pantera L 264 8 351.0 15.8 4.22 3.170 14.50 0 1 5
## Maserati Bora 335 8 301.0 15.0 3.54 3.570 14.60 0 1 5
## carb
## Toyota Corona 1
## Datsun 710 1
## Merc 240D 2
## Merc 230 2
## Fiat 128 1
## Honda Civic 2
## Toyota Corolla 1
## Fiat X1-9 1
## Volvo 142E 2
## Porsche 914-2 2
## Lotus Europa 2
## Hornet 4 Drive 1
## Valiant 1
## Mazda RX4 4
## Mazda RX4 Wag 4
## Merc 280 4
## Merc 280C 4
## Ferrari Dino 6
## Hornet Sportabout 2
## Duster 360 4
## Merc 450SE 3
## Merc 450SL 3
## Merc 450SLC 3
## Cadillac Fleetwood 4
## Lincoln Continental 4
## Chrysler Imperial 4
## Dodge Challenger 2
## AMC Javelin 2
## Camaro Z28 4
## Pontiac Firebird 2
## Ford Pantera L 4
## Maserati Bora 8
O último conjunto de funções apresentado nessa aula para a manipulação de Data frames será constituído pelas funções: cbind(), rbind() e duplicated().
As funções cbind() e rbind() são utilizadas para fundir Data frames que possuem o mesmo número de linhas e colunas, respectivamente. A função cbind() combina as colunas de duas Data frames, para isso, ambas devem possuir o mesmo número de linhas. Já a função rbind() realiza a fusão de duas Data frames pelas linhas. Assim, ambas devem possuir o mesmo número de colunas.
A seguir, vamos criar uma nova Data frame contendo duas colunas. A primeira coluna será constituída da subtração dos valores contidos na coluna “cyl” pelos valores da coluna “gear” da Data frame mtcars_data. A segunda coluna será constituída pelo resultado da multiplicação das mesmas colunas. Em seguida, as colunas dessa Data frame serão combinadas à Data frame mtcars_data pelo uso da função cbind().
#Criando a nova Data frame
new_dataframe<-data.frame(sub_cyl_gear=(mtcars_data$cyl-mtcars_data$gear), mult_cyl_gear=(mtcars_data$cyl*mtcars_data$gear))
#Visualizando a nova Data frame
new_dataframe
## sub_cyl_gear mult_cyl_gear
## 1 1 12
## 2 0 16
## 3 0 16
## 4 0 16
## 5 0 16
## 6 0 16
## 7 0 16
## 8 0 16
## 9 0 16
## 10 -1 20
## 11 -1 20
## 12 3 18
## 13 3 18
## 14 2 24
## 15 2 24
## 16 2 24
## 17 2 24
## 18 1 30
## 19 5 24
## 20 5 24
## 21 5 24
## 22 5 24
## 23 5 24
## 24 5 24
## 25 5 24
## 26 5 24
## 27 5 24
## 28 5 24
## 29 5 24
## 30 5 24
## 31 3 40
## 32 3 40
#Fundindo a nova Data frame com a Data frame mtcars_data e salvando por cima de mtcars_data
mtcars_data<-cbind(mtcars_data, new_dataframe)
#Visualizando a nova Data frame mtcars_data
mtcars_data
## horsepower cyl disp mpg drat wt qsec vs am gear
## Toyota Corona 97 4 120.1 21.5 3.70 2.465 20.01 1 0 3
## Datsun 710 93 4 108.0 22.8 3.85 2.320 18.61 1 1 4
## Merc 240D 62 4 146.7 24.4 3.69 3.190 20.00 1 0 4
## Merc 230 95 4 140.8 22.8 3.92 3.150 22.90 1 0 4
## Fiat 128 66 4 78.7 32.4 4.08 2.200 19.47 1 1 4
## Honda Civic 52 4 75.7 30.4 4.93 1.615 18.52 1 1 4
## Toyota Corolla 65 4 71.1 33.9 4.22 1.835 19.90 1 1 4
## Fiat X1-9 66 4 79.0 27.3 4.08 1.935 18.90 1 1 4
## Volvo 142E 109 4 121.0 21.4 4.11 2.780 18.60 1 1 4
## Porsche 914-2 91 4 120.3 26.0 4.43 2.140 16.70 0 1 5
## Lotus Europa 113 4 95.1 30.4 3.77 1.513 16.90 1 1 5
## Hornet 4 Drive 110 6 258.0 21.4 3.08 3.215 19.44 1 0 3
## Valiant 105 6 225.0 18.1 2.76 3.460 20.22 1 0 3
## Mazda RX4 110 6 160.0 21.0 3.90 2.620 16.46 0 1 4
## Mazda RX4 Wag 110 6 160.0 21.0 3.90 2.875 17.02 0 1 4
## Merc 280 123 6 167.6 19.2 3.92 3.440 18.30 1 0 4
## Merc 280C 123 6 167.6 17.8 3.92 3.440 18.90 1 0 4
## Ferrari Dino 175 6 145.0 19.7 3.62 2.770 15.50 0 1 5
## Hornet Sportabout 175 8 360.0 18.7 3.15 3.440 17.02 0 0 3
## Duster 360 245 8 360.0 14.3 3.21 3.570 15.84 0 0 3
## Merc 450SE 180 8 275.8 16.4 3.07 4.070 17.40 0 0 3
## Merc 450SL 180 8 275.8 17.3 3.07 3.730 17.60 0 0 3
## Merc 450SLC 180 8 275.8 15.2 3.07 3.780 18.00 0 0 3
## Cadillac Fleetwood 205 8 472.0 10.4 2.93 5.250 17.98 0 0 3
## Lincoln Continental 215 8 460.0 10.4 3.00 5.424 17.82 0 0 3
## Chrysler Imperial 230 8 440.0 14.7 3.23 5.345 17.42 0 0 3
## Dodge Challenger 150 8 318.0 15.5 2.76 3.520 16.87 0 0 3
## AMC Javelin 150 8 304.0 15.2 3.15 3.435 17.30 0 0 3
## Camaro Z28 245 8 350.0 13.3 3.73 3.840 15.41 0 0 3
## Pontiac Firebird 175 8 400.0 19.2 3.08 3.845 17.05 0 0 3
## Ford Pantera L 264 8 351.0 15.8 4.22 3.170 14.50 0 1 5
## Maserati Bora 335 8 301.0 15.0 3.54 3.570 14.60 0 1 5
## carb sub_cyl_gear mult_cyl_gear
## Toyota Corona 1 1 12
## Datsun 710 1 0 16
## Merc 240D 2 0 16
## Merc 230 2 0 16
## Fiat 128 1 0 16
## Honda Civic 2 0 16
## Toyota Corolla 1 0 16
## Fiat X1-9 1 0 16
## Volvo 142E 2 0 16
## Porsche 914-2 2 -1 20
## Lotus Europa 2 -1 20
## Hornet 4 Drive 1 3 18
## Valiant 1 3 18
## Mazda RX4 4 2 24
## Mazda RX4 Wag 4 2 24
## Merc 280 4 2 24
## Merc 280C 4 2 24
## Ferrari Dino 6 1 30
## Hornet Sportabout 2 5 24
## Duster 360 4 5 24
## Merc 450SE 3 5 24
## Merc 450SL 3 5 24
## Merc 450SLC 3 5 24
## Cadillac Fleetwood 4 5 24
## Lincoln Continental 4 5 24
## Chrysler Imperial 4 5 24
## Dodge Challenger 2 5 24
## AMC Javelin 2 5 24
## Camaro Z28 4 5 24
## Pontiac Firebird 2 5 24
## Ford Pantera L 4 3 40
## Maserati Bora 8 3 40
Note que as colunas contidas em new_dataframe foram adicionadas após o término das colunas originais de mtcars_data.
Podemos seguir o mesmo conceito para utilizarmos a função rbind(). Porém, no exemplo para rbind() iremos adicionar uma repetição das linhas 30,31 e 32 ao término da Data frame mtcars_data.
#Visualizando as seis últimas linhas de mtcars_data
tail(mtcars_data)
## horsepower cyl disp mpg drat wt qsec vs am gear carb
## Dodge Challenger 150 8 318 15.5 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 150 8 304 15.2 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 245 8 350 13.3 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 175 8 400 19.2 3.08 3.845 17.05 0 0 3 2
## Ford Pantera L 264 8 351 15.8 4.22 3.170 14.50 0 1 5 4
## Maserati Bora 335 8 301 15.0 3.54 3.570 14.60 0 1 5 8
## sub_cyl_gear mult_cyl_gear
## Dodge Challenger 5 24
## AMC Javelin 5 24
## Camaro Z28 5 24
## Pontiac Firebird 5 24
## Ford Pantera L 3 40
## Maserati Bora 3 40
#Adicionando ao término das linhas de mtcars_data, uma repetição das linhas 30, 31 e 32
mtcars_data<-rbind(mtcars_data, mtcars_data[30:32,])
#Visualizando as seis últimas linhas de mtcars_data
tail(mtcars_data)
## horsepower cyl disp mpg drat wt qsec vs am gear
## Pontiac Firebird 175 8 400 19.2 3.08 3.845 17.05 0 0 3
## Ford Pantera L 264 8 351 15.8 4.22 3.170 14.50 0 1 5
## Maserati Bora 335 8 301 15.0 3.54 3.570 14.60 0 1 5
## Pontiac Firebird1 175 8 400 19.2 3.08 3.845 17.05 0 0 3
## Ford Pantera L1 264 8 351 15.8 4.22 3.170 14.50 0 1 5
## Maserati Bora1 335 8 301 15.0 3.54 3.570 14.60 0 1 5
## carb sub_cyl_gear mult_cyl_gear
## Pontiac Firebird 2 5 24
## Ford Pantera L 4 3 40
## Maserati Bora 8 3 40
## Pontiac Firebird1 2 5 24
## Ford Pantera L1 4 3 40
## Maserati Bora1 8 3 40
Note que as três últimas linhas contidas em mtcars_data são duplicatas das linhas anteriores. Em muitos casos, podemos encontrar duplicatas em nossas bases de dados. Muitas vezes temos o interesse de removê-las. A função duplicated() é muito útil para isso. Primeiramente, vamos verificar o funcionamento da mesma. Para isso, vamos verificar quais são os valores duplicados contidos na coluna “cyl”.
#Visualizando quais elementos são duplicados na coluna cyl
duplicated(mtcars_data$cyl)
## [1] FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [12] FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE TRUE TRUE TRUE
## [23] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [34] TRUE TRUE
Note que o resultado da função duplicated() é um vetor de valores lógicos informando se o número contido no respectivo index (nesse caso, de 1 a 36) é repetido ou não. Se lembrarmos da indexação e filtragem de valores utilizando a função which(), podemos remover as linhas duplicadas em mtcars_data. É importante ressaltar que nesse momento a remoção será feita considerando todas as colunas da Data frame não somente a coluna “cyl”.
#Visualizando quais elementos são duplicados na coluna cyl
mtcars_data<- mtcars_data[-which(duplicated(mtcars_data)),]
#Visulizando as últimas seis linhas de mtcars_data
tail(mtcars_data)
## horsepower cyl disp mpg drat wt qsec vs am gear carb
## Dodge Challenger 150 8 318 15.5 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 150 8 304 15.2 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 245 8 350 13.3 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 175 8 400 19.2 3.08 3.845 17.05 0 0 3 2
## Ford Pantera L 264 8 351 15.8 4.22 3.170 14.50 0 1 5 4
## Maserati Bora 335 8 301 15.0 3.54 3.570 14.60 0 1 5 8
## sub_cyl_gear mult_cyl_gear
## Dodge Challenger 5 24
## AMC Javelin 5 24
## Camaro Z28 5 24
## Pontiac Firebird 5 24
## Ford Pantera L 3 40
## Maserati Bora 3 40
Note que na tabela apresentada acima, as linhas que estavam duplicadas anteriormente foram eliminadas. Isso acontece pois a fusão das funções which() e duplicated() resultam nos indexes das linhas que serão excluídas devido à presença do sinal de negativo (“-”) presente.
DICA: No R, existem inúmeras formas de se chegar ao mesmo resultado. Caso durante suas pesquisas nos sites de dicas sobre o R você encontre uma forma alternativa de remover duplicatas, não se assute. Isso é algo bem comum.
Finalmente, após todas essas edições feitas em mtcars_data, iremos salvar nossa Data frame em nosso diretório de trabalho. Assim, possuiremos uma versão atualizada do documento tabular com extensão .txt. O comando utilizado para salvar arquivos tabulares em seu computador à partir do R é o write.table(). Esse comando permite a utilização de uma quantidade extremamente variada de argumentos. No exemplo a seguir utilizaremos os seguintes argumentos: x=, file=, col.names=, row.names=, sep= e quote=.
Contudo, antes de salvar o documento, criaremos novamente uma coluna contendo o modelo dos carros. Isso será feito, pois uma vez salvo o arquivo, caso optemos por salvar o nome das linhas, iremos obter uma coluna sem cabeçalho no output. Isso pode dificultar uma futura manipulação do arquivo.
#Criando uma nova coluna com o modelo dos carros
mtcars_data$model<- rownames(mtcars_data)
#Visulizando as primeiras seis linhas de mtcars_data para verificar a presença da coluna criada
head(mtcars_data)
## horsepower cyl disp mpg drat wt qsec vs am gear carb
## Toyota Corona 97 4 120.1 21.5 3.70 2.465 20.01 1 0 3 1
## Datsun 710 93 4 108.0 22.8 3.85 2.320 18.61 1 1 4 1
## Merc 240D 62 4 146.7 24.4 3.69 3.190 20.00 1 0 4 2
## Merc 230 95 4 140.8 22.8 3.92 3.150 22.90 1 0 4 2
## Fiat 128 66 4 78.7 32.4 4.08 2.200 19.47 1 1 4 1
## Honda Civic 52 4 75.7 30.4 4.93 1.615 18.52 1 1 4 2
## sub_cyl_gear mult_cyl_gear model
## Toyota Corona 1 12 Toyota Corona
## Datsun 710 0 16 Datsun 710
## Merc 240D 0 16 Merc 240D
## Merc 230 0 16 Merc 230
## Fiat 128 0 16 Fiat 128
## Honda Civic 0 16 Honda Civic
#Alterando a posição de model da última posição para a primeira
mtcars_data<-mtcars_data[,c(ncol(mtcars_data),1:(ncol(mtcars_data)-1))]
#Visulizando as primerias seis linhas de mtcars_data para verificar a alteração da posição das colunas
head(mtcars_data)
## model horsepower cyl disp mpg drat wt qsec vs
## Toyota Corona Toyota Corona 97 4 120.1 21.5 3.70 2.465 20.01 1
## Datsun 710 Datsun 710 93 4 108.0 22.8 3.85 2.320 18.61 1
## Merc 240D Merc 240D 62 4 146.7 24.4 3.69 3.190 20.00 1
## Merc 230 Merc 230 95 4 140.8 22.8 3.92 3.150 22.90 1
## Fiat 128 Fiat 128 66 4 78.7 32.4 4.08 2.200 19.47 1
## Honda Civic Honda Civic 52 4 75.7 30.4 4.93 1.615 18.52 1
## am gear carb sub_cyl_gear mult_cyl_gear
## Toyota Corona 0 3 1 1 12
## Datsun 710 1 4 1 0 16
## Merc 240D 0 4 2 0 16
## Merc 230 0 4 2 0 16
## Fiat 128 1 4 1 0 16
## Honda Civic 1 4 2 0 16
Observe como dentro da função c(), a função ncol() foi utilizada para que a troca da posição fosse feita sem que fosse necessário saber o index correspondente à última coluna da Data frame.
Agora, podemos salvar nossa Data frame.
#Salvando a Data frame no diretório atual
write.table(x=mtcars_data, file="input_mtcars_cursoR_EDITADO_10_11_17.txt", col.names = T, row.names = F, quote=F, sep=",")
#Conferindo se o arquivo foi salvo no diretório de trabalho
dir()
## [1] "Curso Introdução ao R_ Manipulação de dados e aplicações (Módulo 3 - pt 1 ).avi"
## [2] "Curso Introdução ao R_ Manipulação de dados e aplicações (Módulo 3 - pt 1 ).mp4"
## [3] "Curso R - Modulo 3 - pt 1 - Trnasmissão retomada.avi"
## [4] "Curso R - Modulo 3 - pt 1 - Trnasmissão retomada.mp4"
## [5] "CursoR_aula3_pt2.html"
## [6] "CursoR_aula3_pt2.pdf"
## [7] "CursoR_aula3_pt2.Rmd"
## [8] "CursoR_aula3_pt2_FEH.Rmd"
## [9] "CursoR_aula3_pt2_Final.html"
## [10] "CursoR_aula3_pt2_Final.pdf"
## [11] "CursoR_aula3_pt2_Final.Rmd"
## [12] "CursoR_exercicios_modulo3.Rmd"
## [13] "CursoR_modulo2_aula1.pdf:Zone.Identifier"
## [14] "CursoR_modulo3_aula1.pdf"
## [15] "CursoR_modulo3_aula1.pptx"
## [16] "CursoR_modulo3_aula1.pptx:Zone.Identifier"
## [17] "CursoR_modulo3_aula1_edited.avi"
## [18] "erro1.PNG"
## [19] "exemplo_erro1.txt"
## [20] "exemplo_missing.txt"
## [21] "exercicio_modulo3"
## [22] "exercicio_modulo3_comRespostas.html"
## [23] "exercicio_modulo3_comRespostas.Rmd"
## [24] "exercicio_modulo3_semRespostas.html"
## [25] "exercicio_modulo3_semRespostas.Rmd"
## [26] "exercicios_entregues_modulo3"
## [27] "input_mtcars_cursoR_10_11_17.txt"
## [28] "input_mtcars_cursoR_cabecalho_numerico_10_11_17.txt"
## [29] "input_mtcars_cursoR_EDITADO_10_11_17.txt"
## [30] "selecao_pathway.png"
Note que o arquivo editado agora encontra-se no diretório de trabalho. Na função write.table() o argumento x= informa o nome do objeto criado no R a ser salvo. O argumento file= contém o nome que será utilizado para criar o arquivo tabular no computador. Note que extensão “.txt” deve ser informada. O argumento col.names= recebe um valor lógico que informará se o nomes das colunas deverão ser salvos ou não. O mesmo acontece para row.names=, porém, nesse caso, levando-se em consideração o nome das linhas. Note que selecionamos não salvar o nome da linhas devido à questão já discutida anteriormente (motivo pelo qual criamos a coluna ’model“). O argumento quote= informará se os elementos contidos na Data frame serão informados entre aspas ou não no output gerado. Para esse argumento, também utilizamos uma resposta lógica. O último argumento utilizado é o sep=. Esse argumento já foi apresentado na função read.table(). Esse argumento informa qual será o separador de campos do arquivo. Nesse caso, alteramos nosso separador. O arquivo agora gerado terá vírgula (”,“) como separador.
**DICA:* Para entender melhor o funcionamento da função write.table() e seus argumentos, dê uma olhada no manual da função utilizando o comando ?write.table(). Além disso, a partir do exemplo acima, procure alterar os argumentos e visualizar as alterações causadas no output. Altere um determinado argumento e visualize o output com um editor de texto, por exemplo, o Excel ou o Gedit.
Além da função read.table(), existem outras funções que podem ser úteis para a importação de arquivos tabulares. As funções read.csv(), read.csv2(). read.delim() e read.delim2() são funções que trabalham de maneira específica e que podem ser úteis em determinados casos.
As funções read.csv() e read.csv2() irão fazer a importação de arquivos delimitados por vírgula (“,”) e ponto e vírgula (“;”), respectivamente. Desta forma, uma vez que sejam utilizadas para importar um arquivo delimitado por algum desses caracteres, não é necessário informar o argumento sep=. Os demais argumentos recebidos por essas funções são idênticos aos informados à função read.table(). Um detalhe importante é que essas funções analisam dados de dois grupos de arquivos que podemos ter acesso frequentemente. Como a função read.csv() faz a leitura de arquivos separados por vírgula, ela utiliza como separador decimal o ponto (“.”). Já no caso da função read.csv2(), o caracter usado como delimitador de campos é o ponto e vírgula. Isso deve-se ao fato dessa função considerar a vírgula (“,”) como sendo o separador de casas decimais. Isso é muito útil quando utilizamos arquivos de texto gerados pelo Excel com configurações em português. Pois nesse caso, a separação de campos por ponto e vírgula (“;”) e de casas decimais por vírgula (“,”), será o padrão.
As funções read.delim() e read.delim2() funcionam de maneira análoga às funções read.csv() e read.csv2(), respectivamente. A diferença é que ambas utilizarão tabulação como o separador de casas decimais. Contudo, read.delim() irá utilizar ponto (“.”) como separador de casas decimais e read.delim2() utilizará vírgula (“,”).
DICA: É possível informar o argumento sep= para todas essas funções, caso desejemos alterar o separador de campos que estamos utilizando. Nesse caso, a diferença ficará somente em qual separador de casas decimais está sendo utilizado de maneira padrão pela função.
Existem maneiras de importar arquivos com formatos referentes a outros softwares diretamente no R. Por exemplo, podemos importar arquivos .xls do Excel e arquivos gerados no SPSS. Esse procedimento é feito utilizando funções contidas em alguns pacotes adicionais do R. Nós falaremos um pouco sobre esses pacotes em nosso último módulo. Contudo, mais informações podem ser encontradas no link a seguir: https://www.datacamp.com/community/tutorials/r-data-import-tutorial
Alguns erros são comumente observados durante a importação de arquivos tabulares no R. A seguir, discutiremos as causas e resoluções para alguns deles.
Este erro é bem comum na importação de dados no R. Algumas vezes, uma simples troca de letras faz com que o nome do arquivo não seja reconhecido, e essa mensagem de erro seja informada. No exemplo abaixo, substituiremos o nome do arquivo “input_mtcars_cursoR_10_11_17.txt” por “mtcars_cursoR_10_11_17.txt”.
#Importando o arquivo tabular para o R
mtcars_data<-read.table(file="mtcars_cursoR_10_11_17.txt",h=F, sep="\t")
## Warning in file(file, "rt"): não foi possível abrir o arquivo
## 'mtcars_cursoR_10_11_17.txt': No such file or directory
## Error in file(file, "rt"): não é possível abrir a conexão
Note que a seguinte mensagem de erro foi informada:
Warning in file(file, “rt”): cannot open file ‘mtcars_cursoR_10_11_17.txt’: No such file or directory
Essa mensagem informa que não foi possível identificar o arquivo informado no diretório. Portanto, sempre que essa mensagem for informada, procure verificar o nome do arquivo informado, se o mesmo está inserido no diretório de trabalho ou até mesmo se você está no diretório de trabalho correto.
DICA: Antes de se desesperar por uma mensagem de erro em um comando no R, procure ler a mensagem de erro com calma. Na grande maioria das vezes, o motivo do erro estará bem definido na mensagem.
Esse é um erro muito comum no R. Geralmente esse erro é causado pela presença de algum caracter especial que não é reconhecido pelo conjunto de caracteres padrão que o R utiliza. Por exemplo, a presença de barras dentro de alguma das células (“/” ou “") podem causar esse erro. A melhor maneira de solucionar esse problema é através da inspeção manual da linha correspondente ao erro. Assim podemos identificar a presença de caracteres problemáticos e removê-los. Contudo, caso os caracteres sejam realmente necessários, podemos adicionar o argumento * fileEncoding =* à função read.table() de maneira que informamos um novo conjunto de caracteres que o R deverá utilizar. Geralmente o conjunto de caracteres padrão de editores de texto em português é o”ISO-8859-1“. Mais informações podem ser encontradas no link à seguir, na seção encoding: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
Figura 2: Erro geralmente observado quando uma determinada linha do arquivo que está sendo importado não contém o número de colunas esperado.
Este erro ocorre quando informamos o separados inadequando ao argumento sep=.
#Importando o arquivo tabular para o R
mtcars_data<-read.table(file="input_mtcars_cursoR_10_11_17.txt",h=T, sep=",")
#Verificando a importação do arquivo com a função head()
head(mtcars_data)
## mpg.cyl.disp.hp.drat.wt.qsec.vs.am.gear.carb.model
## 1 21\t6\t160\t110\t3.9\t2.62\t16.46\t0\t1\t4\t4\tMazda RX4
## 2 21\t6\t160\t110\t3.9\t2.875\t17.02\t0\t1\t4\t4\tMazda RX4 Wag
## 3 22.8\t4\t108\t93\t3.85\t2.32\t18.61\t1\t1\t4\t1\tDatsun 710
## 4 21.4\t6\t258\t110\t3.08\t3.215\t19.44\t1\t0\t3\t1\tHornet 4 Drive
## 5 18.7\t8\t360\t175\t3.15\t3.44\t17.02\t0\t0\t3\t2\tHornet Sportabout
## 6 18.1\t6\t225\t105\t2.76\t3.46\t20.22\t1\t0\t3\t1\tValiant
Note que apesar de não terem sido informadas mensagens de erro, a Data frame criada no ambiente do R não está no formato desejado. Como o arquivo importado possui como separador de campos a tabulação e nesse caso a vírgula foi informada como separador ao argumento sep=, não houve separação das colunas. Assim, a Data frame é interpretada como possuindo somente uma coluna, o que pode ser verificado pelo comando abaixo:
#Verificando as dimensões da Data frame importada
dim(mtcars_data)
## [1] 32 1
A resolução deste erro é simples, precisamos unicamente informar o separador correto ao argumento sep=. Contudo, esse exemplo ressalta bem a importância de fazer uma verificação visual da importação dos dados antes de iniciarmos qualquer procedimento de análise.
IMPORTANTE: Além da verificação visual da organização do dado, também devemos fazer a verificação da estrutura dos elementos contidos na Data frame antes de iniciarmos as análises. Isso é importante para garantir que cada um dos elementos contidos realmente correspondem às classes esperadas (caracteres, numéricos, fatores, etc.).
Os cabeçalhos das tabelas podem ser uma fonte de problema muito comum no R. O argumento h= ou header= utilizado na função read.table() recebe uma resposta lógica quanto a presença ou não de cabeçalho. Caso essa resposta seja dada de maneira equivocada, a importação será projudicada. Por exemplo, vamos verificar o que aconteceria se por algum acaso informássemos que o arquivo “input_mtcars_cursoR_10_11_17.txt” não possui cabeçalho.
#Importando o arquivo tabular para o R
mtcars_data<-read.table(file="input_mtcars_cursoR_10_11_17.txt",h=F, sep="\t")
#Verificando a importação do arquivo com a função head()
head(mtcars_data)
## V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
## 1 mpg cyl disp hp drat wt qsec vs am gear carb model
## 2 21 6 160 110 3.9 2.62 16.46 0 1 4 4 Mazda RX4
## 3 21 6 160 110 3.9 2.875 17.02 0 1 4 4 Mazda RX4 Wag
## 4 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1 Datsun 710
## 5 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 Hornet 4 Drive
## 6 18.7 8 360 175 3.15 3.44 17.02 0 0 3 2 Hornet Sportabout
Note que o cabeçalho foi inserido no corpo da tabela e um novo conjunto de cabeçalhos genéricos foi criado. Esse conjunto de cabeçalhos estará sempre presente quando o argumento h= receber como resposta “FALSE”. Note que se o arquivo não contivesse cabeçalho e o argumento h= recebesse como resposta “TRUE”, a primeira linha da tabela, mesmo se essa fosse parte do conjunto de dados, seria interpretada como o cabeçalho.
Um outro problema que pode ser observado envolvendo o cabeçalho de tabelas no R é a utilização de cabeçalhos que possuem nomes iniciando por números. O R não permite que isso ocorra. Portanto, toda vez que isto acontecer, o R incluirá um “X” antes do início do nome. Por exemplo, no comando abaixo, estamos importando uma cópia da tabela “input_mtcars_cursoR_10_11_17.txt”. Contudo, nesse caso, todos os nomes das colunas iniciam com um número que corresponde ao seu index, vamos ver o resultado.
#Importando o arquivo tabular para o R
mtcars_data<-read.table(file="input_mtcars_cursoR_cabecalho_numerico_10_11_17.txt",h=T, sep="\t")
#Verificando a importação do arquivo com a função head()
head(mtcars_data)
## X1mpg X2cyl X3disp X4hp X5drat X6wt X7qsec X8vs X9am X10gear X11carb
## 1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## 2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## 3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## 4 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## 5 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## 6 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
## X12model
## 1 Mazda RX4
## 2 Mazda RX4 Wag
## 3 Datsun 710
## 4 Hornet 4 Drive
## 5 Hornet Sportabout
## 6 Valiant
Note como o “X” foi incluído em todas as colunas. Novamente, não temos um erro na importação. Contudo, isso pode ser um grande problema na manipulação do dado, caso não levemos em consideração.
Previamente à importação do arquivo no R devemos ter conhecimento sobre as classes dos elementos contidos no R, assim como as codificações que utilizamos. Uma das codificações mais importantes em tabelas é a seleção do caracter que indicará que temos um missing value. Como descrito anteriormente, é altamente recomendável que não se utilize valores numéricos para missing value. No caso do R os missing values dentro do sistema são interpretados como “NA” ou “Nan”. o símbolo “NA” indica a ausência de um número em uma determinada posição. Já o símbolo “Nan” indica a presença de um número impossível de ser obtido, como por exemplo, o resultado de uma divisão por zero. Essa diferença é bem sutil. Contudo, em alguns casos, por um determinado motivo, um outro conjunto de caracteres pode ter sido escolhido para representar missing data, por exemplo ponto (“.”), traço (“-”) ou interrogação (“?”). Desta forma, caso façamos a importação desse arquivo no R, o software não interpretará esses caracteres como missing data, o que pode dificultar bastante o processo de filtragem dos dados. Ao invés de modificarmos manualmente isso na base de dados original (às vezes isso nem é possível ou permitido), podemos informar ao R para que ele interprete esse caracteres como missing data. Isso pode ser feito por meio do argumento na.stings=. Para esse argumento devemos informar quais são os caracteres que deverão ser interpretados como “NA”. A seguir iremos apresentar um exemplo simples.
#Importando o arquivo tabular para o R
exemplo_na<-read.table(file="exemplo_missing.txt",h=T, sep="\t")
#Verificando a importação do arquivo
exemplo_na
## ID Var1 Var2
## 1 1 1 ?
## 2 2 20 22
## 3 3 - 45
## 4 4 . 67
## 5 5 33 12
#Importando o arquivo tabular para o R informando os caracteres que deverão ser considerados missing
exemplo_na<-read.table(file="exemplo_missing.txt",h=T, sep="\t", na.strings = c(".", "?", "-"))
#Verificando a importação do arquivo
exemplo_na
## ID Var1 Var2
## 1 1 1 NA
## 2 2 20 22
## 3 3 NA 45
## 4 4 NA 67
## 5 5 33 12
Note que toda posição onde os caracteres selecionados para representar missing data estavam presentes foram substituídos pelo caracter “NA”.
Um outro argumento muito importante que pode ser informado à função read.table() é o argumento colClasses=. Esse argumento permite informar a classe de cada coluna no momento da importação. Vamos utiliza-lo para informar que a segunda coluna de mtcars_data, “cyl”, é da classe fator e as demais são numéricas.
#Importando o arquivo tabular para o R
mtcars_data<-read.table(file="input_mtcars_cursoR_10_11_17.txt",h=T, sep="\t")
#Verificando a estrutura do arquivo com a função str()
str(mtcars_data)
## 'data.frame': 32 obs. of 12 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ...
## $ disp : num 160 160 108 258 360 ...
## $ hp : int 110 110 93 110 175 105 245 62 95 123 ...
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec : num 16.5 17 18.6 19.4 17 ...
## $ vs : int 0 0 1 1 0 1 0 1 1 1 ...
## $ am : int 1 1 1 0 0 0 0 0 0 0 ...
## $ gear : int 4 4 4 3 3 3 3 4 4 4 ...
## $ carb : int 4 4 1 1 2 1 4 2 2 4 ...
## $ model: Factor w/ 32 levels "AMC Javelin",..: 18 19 5 13 14 31 7 21 20 22 ...
#Importando o arquivo tabular para o R e alterando a classe da quarta coluna
mtcars_data<-read.table(file="input_mtcars_cursoR_10_11_17.txt",h=T, sep="\t", colClasses = c("numeric", "factor", rep("numeric", 9), "factor"))
#Verificando a estrutura do arquivo com a função str()
str(mtcars_data)
## 'data.frame': 32 obs. of 12 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : Factor w/ 3 levels "4","6","8": 2 2 1 2 3 2 3 1 1 2 ...
## $ disp : num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec : num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear : num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb : num 4 4 1 1 2 1 4 2 2 4 ...
## $ model: Factor w/ 32 levels "AMC Javelin",..: 18 19 5 13 14 31 7 21 20 22 ...
Note que a segunda coluna, “cyl”, agora foi interpretada como um fator, contendo 3 níveis. Além disso, todas as demais colunas mantiveram a mesma classe.
O R possui uma opção padrão que muitas vezes pode não ser a desejada. Essa opção é a importação de qualquer conjunto de caracteres como pertencendo à classe fator. No caso do arquivo que originou a Data frame mtcars_data, a coluna “model” possui o nome dos modelos do carro. Se notarmos o output da função str() utilizada anteriormente, seremos capazes de notar que essa coluna é interpretada como possuindo um conjunto de fatores. Esse padrão pode ser alterado utilizando o argumento stringsAsFactors =. Esse argumento recebe uma resposta lógica que indicará se strings sequências de caracteres não numéricos devam, ou não, ser interpretados como fatores. No caso de não desejarmos isso, devemos informar “FALSE” para o argumentos. Vejamos o exemplo a seguir com a Data frame mtcars_data.
#Importando o arquivo tabular para o R
mtcars_data<-read.table(file="input_mtcars_cursoR_10_11_17.txt",h=T, sep="\t", stringsAsFactors = F)
#Verificando a estrutura do arquivo com a função str()
str(mtcars_data)
## 'data.frame': 32 obs. of 12 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : int 6 6 4 6 8 6 8 4 4 6 ...
## $ disp : num 160 160 108 258 360 ...
## $ hp : int 110 110 93 110 175 105 245 62 95 123 ...
## $ drat : num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec : num 16.5 17 18.6 19.4 17 ...
## $ vs : int 0 0 1 1 0 1 0 1 1 1 ...
## $ am : int 1 1 1 0 0 0 0 0 0 0 ...
## $ gear : int 4 4 4 3 3 3 3 4 4 4 ...
## $ carb : int 4 4 1 1 2 1 4 2 2 4 ...
## $ model: chr "Mazda RX4" "Mazda RX4 Wag" "Datsun 710" "Hornet 4 Drive" ...
Note que agora a coluna “model” é considerada como possuindo elementos da classe “character”, não mais fatores.
Neste módulo abordamos uma variedade muito grande de assuntos envolvendo a criação, manipulação e edição de bases de dados dentro e fora do R. É importante que nossas bases de dados sejam mantidas dentro do maior controle de qualidade possível. Quanto aos comandos informados nesse módulo, eles serão de uso rotineiro no R. Mesmo que alguns pareçam confusos em um primeiro momento, os mesmos devem ser repetidos e treinados até que sejam totalmente entendidos, uma vez que o domínio desses comandos irá facilitar a dinâmica de trabalho com arquivos tabulares.