Primeiros Passos com o R
|
Parte 3 - Importação e Programação
Existem duas formas de trabalhar com leitura de dados no R: na primeira delas o usuário digita os dados e armazena num objeto, na segunda o usuário lê um arquivo externo (na memória do computador ou até mesmo algum arquivo disponível online).
A primeira já foi suficientemente discutida quando foram apresentadas as funções c()
, rep()
, seq()
, matrix()
, data.frame()
, list()
, etc. Além dessas, são opções interessantes as funções scan()
e readLines()
.
Já para o caso de leitura de arquivos externos, os formatos mais comuns de arquivos para leitura são: texto (txt), comma separated values (csv) e planilhas Excel (xlsx). Todos estes formatos podem ser importados para o R. Outros formatos também são possíveis, mas abordaremos apenas estes por serem os mais comuns.
Contudo, para que a importação seja feita de forma adequada há a necessidade de que os dados estejam tabulados e organizados de forma correta, isto é: observações nas LINHAS, variáveis nas COLUNAS e cada coluna representando uma única variável.
Existem diversos pacotes e funções para importação de dados, as 3 a seguir são apenas opções:
read.table()
.read.csv()
.gdata::read.xls()
.Em geral, a leitura de arquivos externos gera um data frame e cabe ao usuário verificar se os dados possuem cabeçalho, qual o formato dos dados, separador, decimal e dentre outras informações para correta leitura dos dados no R. Além disso, após a leitura, é de suma importância verificar se os formatos das variáveis foram interpretados corretamente e, caso não tenham sido, convertê-las (em geral fazendo uso das funções do tipo as.
já discutidas).
Lembre-se de ler a documentação da função a fim de compreender a utilização dos argumentos para especificá-los de modo que a leitura dos dados seja feita de forma correta. Vejamos um exemplo para cada formato:
dados_txt <- read.table(file = "MingotiAnA4.txt",
header = TRUE,
sep = '\t',
dec = '.')
head(dados_txt)
## emp grp x1 x2 x3 x4
## 1 1 1 -0.45 -0.41 1.09 0.45
## 2 2 1 -0.56 -0.31 1.51 0.16
## 3 3 1 0.06 0.02 1.01 0.40
## 4 4 1 -0.07 -0.09 1.45 0.26
## 5 5 1 -0.10 -0.09 1.56 0.67
## 6 6 1 -0.14 -0.07 0.71 0.28
dados_csv <- read.csv(file = "MingotiAnA4.csv",
header = TRUE,
sep = ';',
dec = '.')
head(dados_csv)
## emp grp x1 x2 x3 x4
## 1 1 1 -0.45 -0.41 1.09 0.45
## 2 2 1 -0.56 -0.31 1.51 0.16
## 3 3 1 0.06 0.02 1.01 0.40
## 4 4 1 -0.07 -0.09 1.45 0.26
## 5 5 1 -0.10 -0.09 1.56 0.67
## 6 6 1 -0.14 -0.07 0.71 0.28
## emp grp x1 x2 x3 x4
## 1 1 1 -0.45 -0.41 1.09 0.45
## 2 2 1 -0.56 -0.31 1.51 0.16
## 3 3 1 0.06 0.02 1.01 0.40
## 4 4 1 -0.07 -0.09 1.45 0.26
## 5 5 1 -0.10 -0.09 1.56 0.67
## 6 6 1 -0.14 -0.07 0.71 0.28
Através da programação é possível automatizar processos, isto é, tarefas que seriam feitas manualmente por seres humanos passam a ser realizadas total ou parcialmente pelo computador. A sequência de passos a ser seguida para realização de uma tarefa é chamada de algoritmo. Para que o computador realize esta sequência de passos é necessário que isso esteja especificado de uma forma que a máquina entenda, isto é, através de uma linguagem de programação.
As estruturas existentes nas linguagens são as mesmas e, por este motivo, é interessante compreender bem estas estruturas de forma genérica para que seja mais simples generalizá-las para diferentes linguagens de programação.
Entenda: é mais fácil você aprender a lógica (que é geral e genérica) antes da linguagem (que é única e segue padrões próprios).
Leia o post Algoritmos e Lógica de Programação.
Vamos discutir como as estruturas genéricas, isto é, presentes em qualquer linguagem de programação, funcionam em R.
Alguns dos tópicos importantes já foram vistos quando as estruturas de dados em R foram apresentadas, como os operadores aritméticos (soma, subtração, divisão, etc), os operadores relacionais (maior, menor, igual, etc) e operadores lógicos (e, ou e não). Mas vamos passar por eles novamente a fim de varrer todas as ferramentas necessárias para fins de programação.
Os operadores aritméticos servem para realizar operações matemáticas básicas. As representações das operações básicas em R são:
Operador | Operação |
---|---|
+ | Adição |
- | Subtração |
* | Multiplicação |
/ | Divisão |
^ | Potência |
exp() | Exponencial |
sqrt() | Raiz quadrada |
factorial() | Fatorial |
log() | Logaritmo |
abs() | Valor absoluto |
round() | Arredondamento |
ceiling() | Arredondamento para cima |
floor() | Arredondamento para baixo |
Os operadores seguem uma hierarquia, ou seja, uma ordem de precedência. Inicialmente são efetuadas as operações entre parênteses seguindo a ordem: exponenciação, multiplicação/divisão e por fim adição/subtração.
Os operadores relacionais são utilizados para comparar valores de variáveis e sempre retornam valores lógicos, ou seja, verdadeiro ou falso. No R os operadores relacionais são:
Operador | Operação |
---|---|
> | Maior que |
< | Menor que |
>= | Maior ou igual que |
<= | Menor ou igual que |
== | Igual |
!= | Diferente |
Os operadores lógicos, assim como os relacionais, retornam resultados lógicos. Contudo sua finalidade é outra. Diferentemente dos aritméticos eles servem para comparar outros resultados lógicos. Existem 3 operadores lógicos: E, OU e NÃO; representados no R por &,| e !, respectivamente.
Os operadores lógicos são os últimos da hierarquia de precedência, pois inicialmente são efetuadas as operações aritméticas, depois as relacionais e, por fim, as operações lógicas.
Uma estrutura condicional é utilizada quando a ação a ser tomada depende de uma condição ser ou não satisfeita, algo como: se tal coisa acontecer faça isso, senão faça aquilo.
Podemos trabalhar com condicionais simples, compostas e aninhadas. Há ainda uma estrutura condicional chamada estrutura de escolha:
Quando uma ação é tomada apenas se a condição de interesse for verdadeira. Genericamente:
Considere que estamos interessados em verificar se um valor armazenado em uma variável x é maior que 100.
## [1] "Este número é maior que 100"
Note como no caso acima caso o valor não seja maior que 100 nenhuma ação será tomada.
Quando uma ação é tomada quando a condição de interesse for verdadeira e outra for tomada quando ela for falsa. Genericamente:
if(<condição>) {
<comandos a ser executados caso seja satisfeita a condição>
} else {
<comandos a ser executados caso NÃO seja satisfeita a condição>
}
Consideremos o mesmo exemplo anterior, mas agora estamos interessados em retornar duas mensagens diferentes: uma para caso o número seja maior que 100 e outra para caso não seja:
## [1] "Este número NÃO é maior que 100"
Quando há mais de uma situação. Neste caso necessitamos de diversas condicionais, uma dentro da outra. Genericamente:
if (<condição>) {
<comandos a ser executados caso seja satisfeita a condição>
} else if(<condição>) {
<comandos a ser executados caso seja satisfeita a segunda condição>
} else {
<comandos a ser executados caso nenhuma condição seja satisfeita>
}
Desta forma podemos ampliar o exemplo anterior adicionando mais uma condição:
x <- 100
if (x > 100) {
"Este número é maior que 100"
} else if(x == 100) {
"Este número é IGUAL a 100"
} else {
"Este número NÃO é maior que 100"
}
## [1] "Este número é IGUAL a 100"
A estrutura de escolha é uma opção bem mais simples que a solução de condicionais aninhadas. Genericamente:
switch(<variável>,
caso1 (valor da variável) = valor1 (output),
caso2 = valor2,
.
.
.
casoN = valorN)
Para construção de uma sentença utilizando switch()
podemos fazer uso dos índices:
y <- 2
x <- switch(
y, # variável que será utilizada
"primeira mensagem", # output se y = 1
"segunda mensagem", # output se y = 2
"terceira mensagem", # output se y = 3
"quarta mensagem" # output se y = 4
)
x
## [1] "segunda mensagem"
Também é possível utilizar o switch()
com o valor que a variável analisada assume:
k = "a"
w = switch(
k,
"a" = 1, # output se k="a"
"b" = 2, # output se k="b"
"c" = 3, # output se k="c"
"d" = 4 # output se k="d"
)
print (w)
## [1] 1
As estruturas de repetição permitem executar mais de uma vez um mesmo bloco de código sob determinadas condições quantas vezes forem necessárias. Por se tratar de uma ou mais operações que se repetem, também são chamadas de laços interativos ou loops. Temos 3 ferramentas para construir loops no R: o enquanto, o repita e o para.
A primeira forma de se utilizar uma estrutura de repetição é com o enquanto, de tal forma que dizemos: “enquanto a condição não for aceita faça tal coisa”. Normalmente a condição está associada a um contador. Genericamente:
Um exemplo simples:
## [1] 3
## [1] 5
## [1] 7
## [1] 9
## [1] 11
## [1] 13
## [1] 15
É uma estrutura extremamente parecida com o enquanto, porém é logicamente inversa. Trata-se de uma estrutura alternativa ao enquanto em que o teste lógico é feito no final da estrutura, e não no começo. Compare:
Enquanto a condição não for aceita faça tal coisa.
Faça tal coisa até que a condição seja aceita.
No R essa estrutura sempre vem acompanhada de um if e um break para que o loop seja encerrado. Genericamente:
Um exemplo simples:
## [1] 2
## [1] 4
## [1] 6
## [1] 8
## [1] 10
## [1] 12
## [1] 14
## [1] 16
## [1] 18
## [1] 20
## [1] 22
## [1] 24
## [1] 26
## [1] 28
## [1] 30
O para é uma das estruturas mais utilizadas e possui uma vantagem sobre as outras duas apresentadas: ela é auto incrementável, isto é, não há necessidade de especificar que uma variável contadora recebe ela mesma mais um incremento, o para faz isso automaticamente o que exige menos código para realização de uma tarefa que exige repetição. Genericamente:
Um exemplo simples:
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
Existe uma função no R chamada ifelse()
que pode facilitar as tarefas em algumas situações, verifique.
Existe um operador chamado next
que pode ser utilizado quando desejamos que uma iteração seja ignorada e que a próxima seja executada normalmente, por exemplo, caso estejamos interessados em printar em tela os números de 1 a 10 EXCETO 5 e 7:
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 6
## [1] 8
## [1] 9
## [1] 10
O break
, apresentado na estrutura repeat
pode ser usado para forçar a parada de outros loops, veja:
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
A família apply é um conjunto de funções que servem como alternativa aos loops em R. São úteis para melhorar o fluxo de trabalho e reduzir o tempo computacional. As mais utilizadas são: apply
, tapply
, laaply
, sapply
. Outras menos utilizadas são: mapply
, eapply
, rapply
, etc.
apply
Utiliza-se a apply
quando temos uma matriz ou um dataframe e desejamos aplicar a mesma função a todas as linhas ou todas as colunas.
X = matriz ou dataframe, MARGIN = 1 para cálculos em linhas; 2 para cálculos em colunas, FUN = função a ser aplicada.
Vamos aplicar a função apply
a uma matriz:
## [,1] [,2] [,3] [,4]
## [1,] 14 7 2 12
## [2,] 4 7 11 4
## [3,] 0 14 1 0
## [4,] 0 5 11 13
## [1] 8.75 6.50 3.75 7.25
## [1] 4.50 8.25 6.25 7.25
tapply
Com a tapply
é possível obter medidas descritivas de variáveis para cada nível de uma outra variável disponível nos dados.
X = coluna de uma matriz ou dataframe que será utilizada para fazer os cálculos, INDEX = é a coluna de uma matriz ou dataframe que contém os níveis, FUN = função a ser aplicada.
Vamos considerar o dataset iris
nativo do R e obter a média da variável Sepal.Length para cada nível da variável Species:
## setosa versicolor virginica
## 5.006 5.936 6.588
laaply
e sapply
O laaply
e a sapply
são usadas quando temos uma lista e queremos aplicar a mesma função a cada elemento da lista. Utilizando a laapply
o resultado será uma lista já o resultado da sapply
será um vetor.
X = é uma lista, FUN = função a ser aplicada em cada elemento da lista.
Considere o conjunto de dados nativo do R women
. Este data set é um data frame tem duas variávais: height e weight.
## $height
## [1] 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
##
## $weight
## [1] 115 117 120 123 126 129 132 135 139 142 146 150 154 159 164
## $height
## [1] 65
##
## $weight
## [1] 136.7333
## height weight
## 65.0000 136.7333
Recomendo fortemente a leitura dos seguintes materiais, os quais usei como base para produção desse texto:
Críticas e sugestões a este material sempre serão bem vindas.
Para entrar em contato comigo, envie uma mensagem para lineuacf@gmail.com.