1. Introdução

A comunidade que trabalha com R comenta sobre “objetos no R” mas o que seriam esses objetos? como diferenciá-los dentro do R, que objeto utilizar para trabalhar com diferentes tipos de dados? O R não tem um acesso direto à memória do computador, então sua execução é direcionada a estruturas especializadas que chamamos de objetos. Os objetos em R possuem dois atributos: Assim sendo, tentei resumir esse tema nesta prática de tal forma a facilitar a sua assimilação pela comunidade iniciante no R.

2. Objetivos

Apresentar os diferentes objetos que o R possui. Construí-los e verificar a diferença entre eles.

3. Protocolo

3.1. O que são objetos no R?

O R é uma linguagem de programação orientada a objetos, eles podem armazenar vetores, matrizes, funções, arrays, dataframes e listas. Há duas formas de criarmos objetos no R, a primeira forma e mais utilizada é fazendo uso do operador assignment (formado pelos sinais menor que (<) e menos (-)) apontando para o nome do abjeto. O segundo modo é utilizando o sinal de igual (=), o nome do objeto fica a esquerda do sinal.

# utilizando o operador assignment
objeto_1 <- "utilizando o operador assignment"
objeto_2 <- "utilizando o sinal de igual"

3.2. Vetores

Qualquer conjunto unidimensional contendo valores é considerado um vetor no R. Os vetores no R podem ser constituídos por números, caracteres ou valores lógicos.
  • vetor numérico: conjunto unidimensional constituído por números;
  • vetor de strings: conjunto unidimensional constituído por caracteres;
  • vetor lógico: conjunto unidimensional constituído por valores lógicos (verdadeiro, falso).
# vetor numerico
vet_num <- 12

# vetor de strings
vet_str <- "a"

# vetor logico
vet_log <- TRUE

utilizaremos a função (aprenderemos sobre funções mais pra frente) de concatenação - c() para juntar dados. Por exemplo suponha que eu quero criar um veotor que armazene as idades de pacientes de uma coorte. Assim posso fazer para os três tipos de vetores.

# vetor numerico 
pac_idades <- c(56, 78, 89, 66, 73)

# vetor de strings
pac_nomes <- c("Joaquim", "Josefina", "Maria Cândida", "Alcides", "Pedro")
amostras <- c("a1", "a2", "b1", "c5", "d1")

# vetor logico
fumantes <- c(TRUE, TRUE, FALSE, TRUE, FALSE, FALSE)
alcoolatra <- c(T, T, T, F, F) # posso abreviar as palavras TRUE (T) e FALSE (F)

3.2.1. Operações vetoriais

Para esse tópico vamos criar dois vetores numéricos.
  • conj_A1 = 2, 5, 12, 15, 37
  • conj_B1 = 9, 8, 4, 28, 23
Vamos fazer algumas operações:
  • soma;
  • subtração;
  • multiplicação;
  • divisão.
# criando vetores
conj_A1 <- c(2, 5, 12, 15, 37)
conj_B1 <- c(9, 8, 4, 28, 23)

# operacoes
# soma
soma <- conj_A1 + conj_B1

# subtracao
subtracao <- soma - conj_B1

# multiplicacao
multiplicacao <- conj_A1 * subtracao

# divisao
divisao <- multiplicacao / soma

# somando 50 a todos elementos do elemento "pac_idades"
c(pac_idades + 50)

3.2.2. Utilizando algumas funções estatísticas em vetores

Na maioria das vezes queremos fazer uma estatística básica dos dados que estamos trabalhando. Abaixo apresento algumas funções relacionado a estatística básica.

# criando vetor
pac_prostate_idades <- c(42, 50, 67, 78, 75)

# valor minimo
min(pac_prostate_idades)

# valor maximo
max(pac_prostate_idades)

# minimo e maximo
range(pac_prostate_idades)

# comprimento do vetor
length(pac_prostate_idades)

# media
mean(pac_prostate_idades)

# mediana
median(pac_prostate_idades)

# resumo estatistico
summary(pac_prostate_idades)

Q_01 - Faça as operações abaixo no ambiente R.

Q_01.1.) Crie dois vetores numéricos e multiplique-os por três.

Q_01.2.) Apresente um resumo estatístico dos vetores criado no Q_01.1.

Q_01.3.) Crie um vetor de cada tipo (numérico, string e lógico)

3.2.3. Acessando valores de vetores

Algumas vezes não queremos visualizar todos os elementos do vetor, queremos apenas acessar algumas posições. No R precisamos digitar o nome do vetor seguido de um par de colchetes e dentro deles a posição que deseja.

# acessando o terceiro elemento do vetor "pac_nomes".
pac_nomes[3]

# acessando o segundo, quarto e quinto valor de "pac_nomes".
pac_nomes[c(2, 4, 5)]

# criando um vetor com elementos do primeiro ao terceiro elemento de outro vetor
novo_vetor <- pac_nomes[c(1:3)]

# acessando todos os elementos menos o primeiro
pac_nomes[-1]

# trocando valor do primeiro elemento
pac_prostate_idades[1] <- 80

# visualizando o ultimo elemento de um vetor
vet_ALFABETO[length(vet_ALFABETO)]

# filtragem de pac_idades , 75
pac_idades[pac_idades < 75]

3.2.4. Criando vetores através de sequências

Algumas vezes precisaremos criar vetores com peridiocidade, dessa forma apresento abaixo alguns comandos para criação de sequências.

# gerando sequencia do 3 ao 12 com intervalo de 4 com a funcao seq()
sequencia_1 <- seq(from=3, to=13, by=2)

# gerando sequencia do 1 ao 10 com :
sequencia_2 <- 1:10

# gerando sequencia repetindo o 1 5 vezes com a funcao rep()
sequencia_3 <- rep(1, 5)

# repetindo o vetor pac_prostate_idades 3 vezes
sequenlcia_4 <- rep(pac_prostate_idades, 3)

# gerando sequencia com dados aleatorios: 5 elementos, valor minimo: 5 e valor maximo: 30
sequencia_5 <- runif(n=5, min=5, max=30)

# gerando uma distribuicao normal com 15 elementos, media=2 e devio-padrao=0.5
sequencia_6 <- rnorm(n=15, mean=2, sd=0.5)

3.2.5. Criando amostras aleatórias

Em diversos momento quando estivermos trabalhando com dados será necessário criar dados aleatórios para testes. Abaixo apresento a função sample() que possui esse propósito.

# amostras aleatorias sem reposicao
aleat_s.rep <- sample(x=1:15, size=10, replace=FALSE)

# amostras aleatorias com reposicao
aleat_c.rep <- sample(x=1:15, size=10, replace=TRUE)

3.2.6. Ordenando os dados

Quando se trabalha com dados muitas vezes é preciso colocar os dados em ordem crescente ou decrescente vamos utilizar a função sort().

# colocando os dados em ordem crescente
sort(x=pac_idades, decreasing=FALSE )

# colocando os dados em ordem decrescente
sort(x=pac_idades, decreasing=TRUE)

Porém, se desejarmos a POSIÇÃO dos dados naquele vetor, utilizaremos a função order().

# verificando a posicao crescente dos dados dentro do vetor
order(pac_idades)

Podemos também obter o valor de ranks para cada valor dentro do objeto

rank(pac_idades)

3.3. Operações um pouco mais avançadas com vetores

3.1. Nomeando elementos dentro do vetor

Supondo que você está com seus dados numéricos e quer nomeá-los, o que você faria? Abaixo apresento uma maneira para nomear esses elementos e para tal, utilizei a função names() juntamente com a função paste() (que vai juntar caracteres), operador : para gerar uma sequência e a função length() que calcula o tamanho do vetor e por fim o argumento sep= que informo o tipo de separador.

# criando um vetor
tempo_s <- c(10, 25, 27, 17, 19)

# nomeando os elementos 
names(tempo_s) <- paste("Amostra", 1:length(tempo_s), sep = "_")

3.2. Tipo do objeto

As funções do R é baseada em tipo de objeto. Muitas funções vão funcionar para um tipo de objeto e para outro tipo não. Assim, abaixo é demonstrado como identificar o tipo e atributos do objeto que está trabalhando.

# identificando o tipo do objeto
typeof(tempo_s)

# identificando a atributos do objeto
## classe
class(tempo_s)

## dimensoes
dim(tempo_s)

## comprimento
length(tempo_s)

## nomes
names(tempo_s)

3.3. Algo a mais sobre vetores

Abaixo seguem alguns comandos que são úteis e facilitam no trabalho de programação com R.

# gerando um vetor complexo
vet_compl <- c(2i+1, 0i+5, 1i^2-1)

# vetor de caracteres utilizando o conjunto de letras do alfabeto em caixa alta do R
vet_ALFABETO <- LETTERS[1:15]

# juntando vetores
c(pac_idades, vet_filtrado)

# vetores com valores especiais
vetor_esp_1 <- c(0, Inf, -Inf, NaN, NA)

# exclui valores NA e NaN do vetor
na.exclude(vetor_esp_1)

# esconde valores NA e NaN do vetor
na.omit(vetor_esp_1)

# retornando posicao dos elementos obedecendo um criterio
which(pac_idades > 70)
which.min(pac_idades)
which.max(pac_idades)

# mostrando os valores do final para o inicio
rev(pac_idades)

Q_02) Responda as questões abaixo referente aos vetores.
Q_02.1) Um aluno de química no laboratório da universisdade onde estuda marcou os tempos referentes a velocidade de uma enzima X em diferentes condições. Os tempos em segundos que ele marcou foram: 16, 14, 9, 7, 3. Crie um objeto chamdo tempo e armazene esses valores dentro dele. Usando funções do R encontre o tempo mínimo, máximo e o tempo médio dos experimentos.

Q_02.2) O mesmo aluno da questão anterior continuou com os experimentos e acrescentou mais dois valores em seus resultados: 11 e 15. Junte esses valores com os dados do exercício anterior sem ter que digitar todos os valores novamente.

Q_02.3) Calcule a velocidade média de uma decomposição de um composto de 12 gramas que levou 3 minutos para se decompor totalmente.

Q_02.4) Um pesquisador fez um experimento coletou 12 amostras, sendo de três tipos diferentes. Crie um vetor com caracteres representando essas 12 amostras divididas em três tipos diferentes.

Q_02.5) Crie três jogos de mega-sena. Utilize a função sample() para gerar os valores. Lembre-se que os valores variam de 1 a 60 e deve-se escolher 6 números.

Q_02.6) Utilizando a mesma lógica do exercício anterior simule o resultado de sete jogadas de um dado.

3.4. Fatores

Outro tipo de vetor é o chamado de vetor de fatores. Quando trabalhamos com este tipo de vetor os valores são registrados em níveis (levels) do fator diferente dos vetores de caracteres.

# criando um vetor de fatores
vet_fat <- factor(c("X1", "X1", "X1", "X2", "X3", "X3"))

# verificando a quantidade por niveis
table(vet_fat)

Se os dados do vetor de fatores possui uma hierarquia podemos ordená-los através do do agumento levels.

# criando o vetor de fatores
vet_fat.2 <- factor(c("pequeno","grande", "medio", "grande", "grande", "grande", "pequeno", "pequeno", "medio"),
                    levels = c("pequeno", "medio", "grande"),
                    ordered = TRUE)

3.5. Transformação de classes

O R pode definir um vetor em uma determinada classe, no entanto, posso transformá-lo em outra classe.

# criando um vetor
vet_num <- c(1, 3, 5, 7, 9)
# transformando-o em um vetor de fatores
as.factor(vet_num)
# transformando-o em um vetor de caracteres
as.character(vet_num)
# transformando-o em um vetor logico
as.logical(vet_num)
# transformando-o em um vetor numerico
as.numeric(vet_num)