Capítulo 4 Fundamentos do R
Em linguagens de programação um objeto é qualquer coisa que pode ser armazenado em uma variável. Em R, os principais tipos de objetos são:
- Vetores: objeto unidimensional contendo TODOS os valores de um tipo de dado.
- Matrizes: vetor (es) em duas dimensões.
- Arrays: matrizes em mais dimensões.
- Fatores: semelhante a vetores, mas com níveis/agrupamentos.
- Dataframes: parecido com matriz mas permite vetores de vários tipos
- Listas: parecido com vetor mas os elementos podem ser de tipos diferentes.
- Funções: cálculo
Vamos comentar sobre alguns objetos. Não iremos falar sobre todos, pois depende do porquê você quer usar o R, qual tipo de dado e análises você vai utilizar.
4.1 Vetores
Haverá momentos que precisaremos armazenar uma sequência de dados. Por exemplo: queremos armazenar as idades de pacientes de uma clínica, não seria viável declarar uma variável para cada paciente. Sendo assim, o R possui alguns objetos que são capazes de trabalhar com dados de acordo com o seu tipo.
O primeiro objeto que iremos trabalhar é o vetor. Em R um vetor é uma sequência de dados de um mesmo tipo. A função que iremos utilizar para criarmos um vetor é a c()
de concatenar.
<- c(45,67,78,49)
idades idades
## [1] 45 67 78 49
Podemos armazenar dados de textos em um vetor.
<- c("id_003","id084","id009","id102")
pacientes pacientes
## [1] "id_003" "id084" "id009" "id102"
Mas não podemos criar um vetor mesclando os tipos de dados, ao fazer isso o R converte todos os valores para character
. Isso é um procedimento denominado de coerção, veremos mais adiante
<- c(5,"Maria",TRUE) exemplo
Os vetores são classificados em classes, são elas:
- Vetor numérico: constituído por valores numéricos.
- Vetor de strings: constituído por caracteres.
- Vetor lógico: constituído por valores lógicos
<- c(1,2,3,4,5) # vetor numerico
v_num <- c("a","b","c") # vetor de strings/character
v_str <- c(T,F,T) # vetor logico v_log
Para verificar a classe de um objeto, iremos utilizar a função class()
.
class(v_num)
## [1] "numeric"
class(v_str)
## [1] "character"
class(v_log)
## [1] "logical"
4.1.1 Indexação de vetores
Podemos recuperar todos os valores de uma só vez de um vetor ou apenas alguns elementos. A posição inicial de um vetor possui valor 1 e segue de forma crescente da esquerda para a direita. Se quisermos acessar um elemento de determinada posição no vetor, precisaremos utilizar [posição desejada]
<- c("TP53","COI","RHO")
genes 2] genes[
## [1] "COI"
4.1.2 Gerando sequências e número aleatórios
Uma forma de criar sequências é utilizar :
(início:fim).
1:10
## [1] 1 2 3 4 5 6 7 8 9 10
Outra forma é utilizar a função seq()
. Com ela podemos informar o início, fim e intervalo.
seq(1,10,2)
## [1] 1 3 5 7 9
As funções que geram números aleatórios são importantes nos processos de amostragem. as funções mais utilizada para esse tipo de terafa são: sample()
e runif()
.
sample(0:50, 10) # gerar 10 num inteiros entre 0 e 50 sem reposicao
## [1] 49 38 29 43 20 50 36 30 3 2
sample(0:10, 5, replace = TRUE) # gerar 5 valores entre 0 e 10 com reposicao
## [1] 3 5 4 1 6
runif(5, 0, 10) # gerar 5 valores decimais entre 0 e 10
## [1] 6.715084 7.638248 4.582566 7.654573 1.894360
Também podemos trabalhar com do tipo character
.
sample(c("feminino", "masculino"), 10, replace = TRUE)
## [1] "feminino" "feminino" "masculino" "feminino" "feminino" "masculino"
## [7] "masculino" "feminino" "feminino" "feminino"
4.1.3 Operações com vetores
Depois de criar os vetores podemos fazer diversas operações com eles. Abaixo seguem alguns exemplos básicos de algumas operações com vetores.
# vetores
<- c(1,3,5,7)
a <- c(2,4,6,8)
b
# soma de vetores
<- a+b
soma_V soma_V
## [1] 3 7 11 15
# subtracao_V de vetores
<- b-a
subtacao_V subtacao_V
## [1] 1 1 1 1
# produtos escalares
<- a*b
produto_V produto_V
## [1] 2 12 30 56
# divisao
<- b/a
divisao_V divisao_V
## [1] 2.000000 1.333333 1.200000 1.142857
# potenciacao
<- a^b
potenciacao potenciacao
## [1] 1 81 15625 5764801
Algumas operações básicas voltadas para a parte estatística envolvendo os vetores:
<- c(65,58,59,63,78,67)
prostate
max(prostate) # valor maximo
## [1] 78
min(prostate) # valor minimo
## [1] 58
range(prostate) # minimo e maximo
## [1] 58 78
sum(prostate) # soma dos valores
## [1] 390
length(prostate) # numero de observacoes
## [1] 6
mean(prostate) # media
## [1] 65
median(prostate) # mediana
## [1] 64
quantile(prostate) # quartis
## 0% 25% 50% 75% 100%
## 58.0 60.0 64.0 66.5 78.0
summary(prostate) # resumo
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 58.0 60.0 64.0 65.0 66.5 78.0
4.2 Matrizes
Matriz é um objeto que distribui os elementos em coordenadas (linhas e colunas). Matriz é mais utilizada em análises multivariadas de fenômenos biológicos, como por exemplo, na organização, manejo e cálculos realizados com dados de mudanças conformacionais de proteínas ao longo do tempo. Há diversas formas de construir uma matriz, veremos algumas delas.
Função matrix()
: Esta função é própria para a criação de matrizes em R. Para saber mais a fundo sosbre os argumentos da função acesse o manual da função (?matrix
). Basicamente precisamos informar um conjunto de dados para a função criar a matriz.
matrix(1:10)
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
## [4,] 4
## [5,] 5
## [6,] 6
## [7,] 7
## [8,] 8
## [9,] 9
## [10,] 10
No entanto, podemos usar mais argumentos da função.
# setando numero de linhas e colunas
matrix(1:10, ncol = 5, nrow = 2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
# setando a ordem prenchimento pelas linhas
matrix(1:10, ncol = 5, nrow = 2, byrow = TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
Funções cbind()
e rbind()
: Outr forma de criar matrizes é juntando vetores por meio da junção de colunas (cbind()
) ou linhas (rbind()
).
<- 1:5
vet_1 <- seq(from=12, to=20, by=2)
vet_2
# unindo vetores atraves das colunas
cbind(vet_1, vet_2)
## vet_1 vet_2
## [1,] 1 12
## [2,] 2 14
## [3,] 3 16
## [4,] 4 18
## [5,] 5 20
# unindo vetores atraves das linhas
rbind(vet_1, vet_2)
## [,1] [,2] [,3] [,4] [,5]
## vet_1 1 2 3 4 5
## vet_2 12 14 16 18 20
4.2.1 Acessando elementos da matriz
Os comandos para acessar elementos de uma matriz são parecidos com os comandos utilizados para acessar os elementos de vetores, a diferença é que na matriz temos linhas e colunas, sendo assim precisamos informar a linha e a coluna do elemento que desejamos visualizar.
<- matrix(runif(15,0,10), ncol = 3)
A
3,2] # elemento com coordenadas: terceira linha e segunda coluna A[
## [1] 6.781636
1] # elemento com coordenadas: todas as linhas e somente a primeira coluna A[,
## [1] 3.281233 3.737409 6.521338 2.226597 6.176863
1:3,] # elemento com coordenadas: linhas 1, 2 e 3 e todas as colunas A[
## [,1] [,2] [,3]
## [1,] 3.281233 0.615154 5.0716949
## [2,] 3.737409 6.145584 0.4911909
## [3,] 6.521338 6.781636 4.1654907
4.3 Data frames
Esse objeto é como um banco de dados, as colunas são as variáveis e as linhas referem-se aos registros. A diferença entre matrizes e data frames é que matrizes são vetores com duas dimensões de modo que, possuem uma única classe, já os data frames possuem colunas que podem ter classes diferentes.
4.3.1 Data frames disponibilizazdos pelo R
O R disponibiliza vários bancos de dados como exemplo. Vamos trabalhar com um banco de dados disponibilizado pelo R. Para isso vamos utilizar a função data()
.
# consultando os bancos de dados disponiveis
data()
# acessando um banco de dados
data("iris")
# documentacao do banco de dados
?iris
4.3.2 Criando um data frame
Para criar um data frame no R vamos utilizar a função data.frame()
.
# construindo uma tabela de metadados de pacientes
<- data.frame(
metadados_pac paciente = c("A01", "A02", "B03", "B05", "C01"),
idade = c(45, 48, 65, 54, 72),
sexo = c("masculino", "masculino", "feminino", "masculino", "feminino"),
fumante = c(TRUE, FALSE, FALSE, FALSE, TRUE))
# visualizando o data frame
metadados_pac
## paciente idade sexo fumante
## 1 A01 45 masculino TRUE
## 2 A02 48 masculino FALSE
## 3 B03 65 feminino FALSE
## 4 B05 54 masculino FALSE
## 5 C01 72 feminino TRUE
# visualizando a idade e sexo
c("idade","sexo")] metadados_pac[,
## idade sexo
## 1 45 masculino
## 2 48 masculino
## 3 65 feminino
## 4 54 masculino
## 5 72 feminino
4.3.3 Executando algumas funções em data frames
# -- banco de dados: iris --
## -- primeiro contato com o dado
# documentacao
?iris
dim(iris) # dimensoes: linhas e colunas
## [1] 150 5
head(iris) # cabecalho
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1 5.1 3.5 1.4 0.2 setosa
## 2 4.9 3.0 1.4 0.2 setosa
## 3 4.7 3.2 1.3 0.2 setosa
## 4 4.6 3.1 1.5 0.2 setosa
## 5 5.0 3.6 1.4 0.2 setosa
## 6 5.4 3.9 1.7 0.4 setosa
tail(iris) # calda
## Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 145 6.7 3.3 5.7 2.5 virginica
## 146 6.7 3.0 5.2 2.3 virginica
## 147 6.3 2.5 5.0 1.9 virginica
## 148 6.5 3.0 5.2 2.0 virginica
## 149 6.2 3.4 5.4 2.3 virginica
## 150 5.9 3.0 5.1 1.8 virginica
summary(iris) # resumo estatistico
## Sepal.Length Sepal.Width Petal.Length Petal.Width
## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100
## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300
## Median :5.800 Median :3.000 Median :4.350 Median :1.300
## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
## Species
## setosa :50
## versicolor:50
## virginica :50
##
##
##
str(iris) # estrutura
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
$Sepal.Length # selecionando uma variavel iris
## [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4 5.1
## [19] 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0
## [37] 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4 6.9 5.5
## [55] 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8 6.2 5.6 5.9 6.1
## [73] 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5
## [91] 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3 6.5 7.6 4.9 7.3
## [109] 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2
## [127] 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8
## [145] 6.7 6.7 6.3 6.5 6.2 5.9
4.4 Listas
Uma lista no R é como um vetor capaz de armazenar elementos com diferentes tipos de dados (armazenando em uma dimensão). Uma mesma lista podemos armazenar vetor, matriz, dataframe, e outros. Sendo assim, as lista podem ser complexas .
Para criar uma lista utilize a função list()
<- list("Hello world",vet_1,A, metadados_pac)
lista lista
## [[1]]
## [1] "Hello world"
##
## [[2]]
## [1] 1 2 3 4 5
##
## [[3]]
## [,1] [,2] [,3]
## [1,] 3.281233 0.615154 5.0716949
## [2,] 3.737409 6.145584 0.4911909
## [3,] 6.521338 6.781636 4.1654907
## [4,] 2.226597 5.980561 1.5460740
## [5,] 6.176863 3.818291 7.9665785
##
## [[4]]
## paciente idade sexo fumante
## 1 A01 45 masculino TRUE
## 2 A02 48 masculino FALSE
## 3 B03 65 feminino FALSE
## 4 B05 54 masculino FALSE
## 5 C01 72 feminino TRUE
Os colchetes duplos [[]]
indicam qual elemento da lista está sendo apresentado, enquanto que o simples []
mostra o subelemento da lista.
4.5 Funções
Um dos grandes poderes do R é a criação de funções com o intuito de realizar trabalhos específicos. A sintaxe básica é: function(lista de argumentos) corpo da função. function indica para o R que estamos criando uma função. Lista de argumentos são argumentos que serão avaliados pela função, tais argumentos são separados por vírgulas. Já o corpo da função é onde iremos escrever o nosso algoritmo a ser utilizado para realizar os cálculos. Utilizamos o assignment para nomear a função.
# criando a funcao
<- function(x,y){
mult_lad * y
x
}
# executando a funcao
mult_lad(2,5)
## [1] 10
mult_lad(10,17)
## [1] 170
Podemos criar uma funcao que calcule o pH de écidos e bases fortes
# criando a funcao
<- function(h){
ph -log10(h)
}
# utilizando a funcao
ph(0.01)
## [1] 2
ph(10^-5)
## [1] 5
4.6 Lista de exercícios
- Crie uma matriz com a sequência de 1 a 20, contendo 4 linhas
- Calcule a média de todas as colunas da matriz do exercício anterior.
- Calcule a média dos números pares de todas as colunas da matriz do exercício 1.
- Crie um objeto com 100 valores aleatórios de uma distribuição uniforme. Quantos elementos são maiores ou iguais a 0,5?