Capítulo 1 Básicos da linguagem R
O conteúdo apresentado aqui foi usado na primeira aula prática do curso de “Aprendizagem Estatística com Aplicações em R”.
Para instalação,
faça o download do R em http://www.r-project.org;
sugestão: utilizar a IDE R Studio.
É muito importante saber como obter ajuda no R. Sempre que estiver em dúvidas quanto as características de alguma função, consule a aba help do RStudio.
?mean #abre a página de ajuda da função 'mean'
??plot #procura por tópicos contendo a palavra 'plot'
1.1 Usando o R
como uma calculadora
O operador + realiza a adição entre dois elementos.
## [1] 3
Um vetor é um conjunto ordenado de valores. O operador : cria uma sequência a partir de um número até outro. A função c concatena valores, criando um vetor.
## [1] 1 2 3 4 5
## [1] 1 2 3 4 5
Além de adicionar dois números, o operador + pode ser usado para adicionar dois vetores.
## [1] 7 9 11 13 15
## [1] 7 9 11 13 15
## [1] 7 9 11 13 15
Os próximos exemplos mostram subtração, multiplicação, exponenciação e divisão.
## [1] 0 1 3 5 9 11
## [1] 4 1 0 1 4
## [1] 1 4 9 16 25 36 49 64 81 100
## [1] 0.3333333 0.6666667 1.0000000 1.3333333 1.6666667 2.0000000 2.3333333
## [8] 2.6666667 3.0000000 3.3333333
1.2 Atribuindo variáveis
Fazer cálculos com o R é bem simples e útil. A maior parte das vezes queremos armazenar os resultados para uso posterior. Assim, podemos atribuir valor à uma variável, através do operador <-.
Agora, podemos reutilizar esses valores para fazer outros cálculos.
## [1] 31
## [1] 10 13 16 19 22
Observe que não temos que dizer ao R qual o tipo da variável, se era um número (as variáveis a e a) ou vetor (x e y).
1.3 Números especias
Para facilitar operações aritméticas, R suporta quatro valores especiais de números: Inf, -Inf, NaN e NA. Os dois primeiros representam infinito positivo e negativo. NaN é um acrônimo inglês para “not a number”, ou seja, não é um número. Ele aparece quando um cálculo não faz sentido, ou não está definido. NA significa “not available”, ou seja, não disponível, e representa um valor faltante.
## [1] Inf Inf NaN NA
## [1] NaN NaN 0
1.4 Vetores, Matrizes e Dataframes
Previamente, vimos alguns tipos de vetores para valores lógicos, caracteres e números. Nessa seção, utilizaremos técnicas de manipulação de vetores e introduziremos o caso multidimensional: matrizes e dataframes.
Abaixo relembramos as operações que já foram feitas com vetores
## [1] 10 9 8 7 6 5
## [1] 1 2 3 4 5 6 7 8
1.4.1 Vetores
Existem funções para criar vetores de um tipo e com tamanho específicos. Todos os elementos deste vetor terá valor zero, FALSE, um caracter vazio, ou o equivalente à nada/vazio para aquele tipo. Veja abaixo duas maneiras de definir um vetor.
## [1] 0 0 0 0 0
## [1] 0 0 0 0 0
## [1] FALSE FALSE FALSE FALSE FALSE
## [1] FALSE FALSE FALSE FALSE FALSE
## [1] "" "" "" "" ""
## [1] "" "" "" "" ""
1.4.1.1 Sequências
Podemos criar sequências mais gerais que aquelas criadas com o operador :. A função seq te permite criar sequências em diferentes maneiras Veja abaixo.
## [1] 3 4 5 6 7 8 9 10 11 12
## [1] 3 5 7 9 11
## [1] 0.10 0.09 0.08 0.07 0.06 0.05 0.04 0.03 0.02 0.01
1.4.1.2 Tamanhos
Todo vetor tem um tamanho, um número não negativo que representa a quantidade de elementos que o vetor contém. A função length retorna o tamanho de um dado vetor.
## [1] 5
## [1] 6
## [1] 7 1 9 3 8 6
1.4.1.3 Indexando vetores
A indexação é útil quando queremos acessar elementos específicos de um vetor. Considere o vetor
Abaixo, três métodos de indexar os mesmos valores do vetor x.
## [1] 1 9 25
Se nomearmos os elementos do vetor, o método abaixo obtém os mesmos valores de x.
## one nine twenty five
## 1 9 25
Cuidado, acessar um elemento fora do tamanho do vetor não gera um erro no R, apenas NA.
## <NA>
## NA
1.4.2 Matrizes
Uma matriz é o equivalente à um vetor, porém em duas dimensões. Abaixo, um exemplo de definição de uma matriz com 4 linhas e 3 colunas (total de 12 elementos).
uma_matriz <- matrix(
1:12,
nrow = 4, #ncol = 3 gera o mesmo resultado. Verifique!
dimnames = list(
c("L1", "L2", "L3", "L4"),
c("C1", "C2", "C3")
)
)
class(uma_matriz)
## [1] "matrix" "array"
## C1 C2 C3
## L1 1 5 9
## L2 2 6 10
## L3 3 7 11
## L4 4 8 12
Por padrão, ao criar uma matrix, o vetor passado como primeiro argumento preenche a matrix por colunas. Para preencher a matrix por linhas, basta especificar o argumento byrow=TRUE
A função dim retorna um vetor de inteiros com as dimensões da variável.
## [1] 4 3
## [1] 4
## [1] 3
## [1] 12
1.4.2.1 Nomeando linhas, columas e dimensões
Da mesma forma para vetores, podemos nomear (e obter os nomes de) linhas e colunas de matrizes.
## [1] "L1" "L2" "L3" "L4"
## [1] "C1" "C2" "C3"
## [[1]]
## [1] "L1" "L2" "L3" "L4"
##
## [[2]]
## [1] "C1" "C2" "C3"
1.4.2.2 Indexação
A indexação de matrizes funciona de maneira similar à de vetores, com a diferença que agora precisam ser especificadas mais de uma dimensão.
## C2 C3
## 5 9
## C1 C2 C3
## 1 5 9
## C2 C3
## L1 5 9
## L2 6 10
## L3 7 11
## L4 8 12
## C2 C3
## L1 5 9
## L2 6 10
## L3 7 11
## L4 8 12
1.4.2.3 Combinando matrizes
Considere a seguinte matriz.
outra_matriz <- matrix(
seq(2, 24, 2),
nrow = 4,
dimnames = list(
c("L5", "L6", "L7", "L8"),
c("C5", "C6", "C7")
))
A combinação de matrizes pode ser feita através das funções cbind e rbind, que combina matrizes por colunas e por linhas, respectivamentes.
## C1 C2 C3 C5 C6 C7
## L1 1 5 9 2 10 18
## L2 2 6 10 4 12 20
## L3 3 7 11 6 14 22
## L4 4 8 12 8 16 24
## C1 C2 C3
## L1 1 5 9
## L2 2 6 10
## L3 3 7 11
## L4 4 8 12
## L5 2 10 18
## L6 4 12 20
## L7 6 14 22
## L8 8 16 24
1.4.2.4 Operações com matrizes
As operações básicas (+, -, *, /) funcionam de elemento a elemento em matrizes, da mesmo forma como em vetores:
## C1 C2 C3
## L1 3 15 27
## L2 6 18 30
## L3 9 21 33
## L4 12 24 36
## C1 C2 C3
## L1 2 50 162
## L2 8 72 200
## L3 18 98 242
## L4 32 128 288
Cuidado: as matrizes e vetores devem ter tamanhos compativeis!
1.4.3 Data frames
um_data_frame <- data.frame(
x = letters[1:5], #coluna de caracteres
y = rnorm(5), #coluna de numeros
z = runif(5) > 0.5 #coluna de logicos
)
um_data_frame
## x y z
## 1 a -0.81800900 FALSE
## 2 b 0.07101737 TRUE
## 3 c 0.89552755 FALSE
## 4 d 0.77976176 TRUE
## 5 e 0.37061145 TRUE
## [1] "data.frame"
## [1] "1" "2" "3" "4" "5"
## [1] "x" "y" "z"
## [1] 3
## [1] 3
## [1] 5
## [1] 5 3
#### Indexação de dataframes
um_data_frame[2:3, -3] #o segundo e o terceiro elementos das duas primeiras colunas do dataframe
## x y
## 2 b 0.07101737
## 3 c 0.89552755
## [1] "data.frame"
## x y
## 2 b 0.07101737
## 3 c 0.89552755
## [1] "b" "c"
class(um_data_frame[2:3, 1]) #como selecionamos um vetor, a classe é a mesma do elemento selecionado
## [1] "character"
## [1] "a" "b" "c" "d" "e"
## [1] "b" "c"
## [1] "b" "c"
## [1] "b" "c"
1.4.3.1 Manipulação de dataframes
novo_data_frame <- data.frame( #mesmas colunas que o dataframe anterior, ordem diferente
z = rlnorm(5), #números distribuídos seguindo a distribuição lognormal
y = sample(5), #número 1 a 5 distribuidos em uma ordem aleatória
x = letters[3:7])
rbind(um_data_frame, novo_data_frame) #qual a dimensão deste elemento?
## x y z
## 1 a -0.81800900 0.0000000
## 2 b 0.07101737 1.0000000
## 3 c 0.89552755 0.0000000
## 4 d 0.77976176 1.0000000
## 5 e 0.37061145 1.0000000
## 6 c 4.00000000 0.9076837
## 7 d 2.00000000 5.0416926
## 8 e 3.00000000 0.5523121
## 9 f 5.00000000 1.1606877
## 10 g 1.00000000 0.8396083
## x y z z y x
## 1 a -0.81800900 FALSE 0.9076837 4 c
## 2 b 0.07101737 TRUE 5.0416926 2 d
## 3 c 0.89552755 FALSE 0.5523121 3 e
## 4 d 0.77976176 TRUE 1.1606877 5 f
## 5 e 0.37061145 TRUE 0.8396083 1 g
?merge #Para mesclar dois dataframes, devemos considerar uma coluna que contenha algum identificador único para cada elemento.
## x y.x z.x z.y y.y
## 1 c 0.8955275 FALSE 0.9076837 4
## 2 d 0.7797618 TRUE 5.0416926 2
## 3 e 0.3706115 TRUE 0.5523121 3
## x y.x z.x z.y y.y
## 1 a -0.81800900 FALSE NA NA
## 2 b 0.07101737 TRUE NA NA
## 3 c 0.89552755 FALSE 0.9076837 4
## 4 d 0.77976176 TRUE 5.0416926 2
## 5 e 0.37061145 TRUE 0.5523121 3
## 6 f NA NA 1.1606877 5
## 7 g NA NA 0.8396083 1