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.

idades <- c(45,67,78,49)
idades
## [1] 45 67 78 49

Podemos armazenar dados de textos em um vetor.

pacientes <- c("id_003","id084","id009","id102")
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

exemplo <- c(5,"Maria",TRUE)

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
v_num <- c(1,2,3,4,5)   # vetor numerico
v_str <- c("a","b","c") # vetor de strings/character
v_log <- c(T,F,T)       # vetor logico

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]

genes <- c("TP53","COI","RHO")
genes[2]
## [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
a <- c(1,3,5,7)
b <- c(2,4,6,8)

# soma de vetores
soma_V <- a+b
soma_V
## [1]  3  7 11 15
# subtracao_V de vetores
subtacao_V <- b-a
subtacao_V
## [1] 1 1 1 1
# produtos escalares
produto_V <- a*b
produto_V
## [1]  2 12 30 56
# divisao
divisao_V <- b/a
divisao_V
## [1] 2.000000 1.333333 1.200000 1.142857
# potenciacao
potenciacao <- a^b
potenciacao
## [1]       1      81   15625 5764801

Algumas operações básicas voltadas para a parte estatística envolvendo os vetores:

prostate <- c(65,58,59,63,78,67)

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()).

vet_1 <- 1:5
vet_2 <- seq(from=12, to=20, by=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.

A <- matrix(runif(15,0,10), ncol = 3)

A[3,2] # elemento com coordenadas: terceira linha  e segunda coluna
## [1] 6.781636
A[,1] # elemento com coordenadas: todas as linhas e somente a primeira coluna
## [1] 3.281233 3.737409 6.521338 2.226597 6.176863
A[1:3,] # elemento com coordenadas: linhas 1, 2 e 3 e todas as colunas
##          [,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
metadados_pac <- data.frame(
  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
metadados_pac[,c("idade","sexo")]
##   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
?iris # documentacao

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 ...
iris$Sepal.Length # selecionando uma variavel
##   [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()

lista <- list("Hello world",vet_1,A, metadados_pac) 
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
mult_lad <- function(x,y){
  x * y
}

# 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
ph <- function(h){
  -log10(h)
}

# utilizando a funcao
ph(0.01)
## [1] 2
ph(10^-5)
## [1] 5

4.6 Lista de exercícios

  1. Crie uma matriz com a sequência de 1 a 20, contendo 4 linhas
  2. Calcule a média de todas as colunas da matriz do exercício anterior.
  3. Calcule a média dos números pares de todas as colunas da matriz do exercício 1.
  4. Crie um objeto com 100 valores aleatórios de uma distribuição uniforme. Quantos elementos são maiores ou iguais a 0,5?