TESTE YAML

CE 083 - Estatística Computacional I

http://www.leg.ufpr.br/ce083


Universidade Federal do Paraná Prof. Fernando de Pol Mayer

Curso de Graduação em Estatística Lab. de Estatística e Geoinformação - LEG

Departamento de Estatística - UFPR


Sumário

Funções e objetos. Classes de objetos.

Autores e licença

Paulo Justiniano Ribeiro Jr., Fernando de Pol Mayer, Walmes Marques Zeviani

Licença Creative Commons
Este obra está licenciado com uma Licença Creative Commons Atribuição-NãoComercial-CompartilhaIgual 4.0 Internacional.

Funções e argumentos

As funções no R são definidas como:

R source
nome(argumento1, argumento2, ...)

Exemplo: função runif() (para gerar valores aleatórios de uma distribuição uniforme):

R source
runif(n, min = 0, max = 1)
R source
runif(10, 1, 100)
R output
 [1] 62.218384 36.000038 33.092476 13.374339 53.638479  8.558735  2.899710
 [8] 44.424794  2.714210  5.154308

Argumentos que já possuem um valor especificado (como max e min) podem ser omitidos:

R source
runif(10)

Se os argumentos forem nomeados, a ordem deles dentro da função não tem mais importância:

R source
runif(min = 1, max = 100, n = 10)

Argumentos nomeados e não nomeados podem ser utilizados, desde que os não nomeados estejam na posição correta:

R source
runif(10, max = 100, min = 1)

Outros tipos de argumentos

Exemplo: função sample():

R source
sample(x, size, replace = FALSE, prob = NULL)
  • x e size devem ser obrigatoriamente especificados
  • replace é lógico: TRUE (T) ou FALSE (F)
  • prob é um argumento vazio ou ausente (“opcional”)

Exemplo: função plot():

R source
plot(x, y, ...)
  • "..." permite especificar argumentos de outras funções (por exemplo par())

Mecanismos de ajuda

Argumentos e detalhes do funcionamento das funções:

R source
?runif

ou

R source
help(runif)

A documentação contém os campos:

  • Description: breve descrição
  • Usage: função e todos seus argumentos
  • Arguments: lista descrevendo cada argumento
  • Details: descrição detalhada
  • Value: o que a função retorna
  • References: bibliografia relacionada
  • See Also: funções relacionadas
  • Examples: exemplos práticos

Procura por funções que contenham palavra:

R source
help.search("palavra")

Ajuda através do navegador (também contém manuais, ...):

R source
help.start()

Busca por palavra nos arquivos da lista de discussão do R:

R source
RSiteSearch("palavra")

Criando uma função

A ideia original do R é transformar usuários em programadores

Criar funções para realizar trabalhos específicos é um dos grandes poderes do R

Por exemplo, podemos criar a famosa função

R source
ola.mundo <- function(){
    writeLines("Olá mundo")
}

E chama-la através de

R source
ola.mundo()
R output
Olá mundo

A função acima não permite alterar o resultado de saída. Podemos fazer isso incluindo um argumento

R source
ola.mundo <- function(texto){
    writeLines(texto)
}

E fazer por exemplo

R source
ola.mundo("Funções são legais")
R output
Funções são legais

(Veremos detalhes de funções mais adiante)

Exercícios

  • Usando a função runif() gere 30 números aleatórios entre:
    • 0 e 1
    • -5 e 5
    • 10 e 500 alternando a posição dos argumentos da função.
  • Veja o help da função (?) "+"
  • Crie uma função para fazer a soma de dois números: x e y

Objetos

Programação orientada a objetos

O que é um objeto?

  • Um símbolo ou uma variável capaz de armazenar qualquer valor ou estrutura de dados

Por quê objetos?

  • Uma maneira simples de acessar os dados armazenados na memória (o R não permite acesso direto à memória)

Programação:

  • Objetos   ⇒   Classes   ⇒   Métodos

“Tudo no R é um objeto.”

“Todo objeto no R tem uma classe”

  • Classe: é a definição de um objeto. Descreve a forma do objeto e como ele será manipulado pelas diferentes funções
  • Método: são funções genéricas que executam suas tarefas de acordo com cada classe. As funções genéricas mais importantes são:
    • summary()
    • plot()

Veja o resultado de

R source
methods(summary)
methods(plot)

A variável x recebe o valor 2 (tornando-se um objeto dentro do R):

R source
x <- 2

O símbolo <- é chamado de operador de atribuição. Ele serve para atribuir valores a objetos, e é formado pelos símbolos < e -, obrigatoriamente sem espaços.

Para ver o conteúdo do objeto:

R source
x
R output
[1] 2

Observação: O símbolo = pode ser usado no lugar de <- mas não é recomendado.

Quando você faz

R source
x <- 2

está fazendo uma declaração, ou seja, declarando que a variável x irá agora se tornar um objeto que armazena o número 2. As declarações podem ser feitas uma em cada linha

R source
x <- 2
y <- 4

ou separadas por ;

R source
x <- 2; y <- 4

Operações matemáticas em objetos:

R source
x + x
R output
[1] 4

Objetos podem armazenar diferentes estruturas de dados:

R source
y <- runif(10)
y
R output
 [1] 0.06249665 0.92901261 0.07006392 0.55073590 0.50235993 0.01308207
 [7] 0.76432884 0.19573620 0.14145277 0.64499517

Note que cada objeto só pode armazenar uma estrutura (um número ou uma sequência de valores) de cada vez! (Aqui, o valor 4 que estava armazenado em y foi sobrescrito pelos valores acima.)

Nomes de objetos

  • Podem ser formados por letras, números, "_", e "."
  • Não podem começar com número e/ou ponto
  • Não podem conter espaços
  • Evite usar acentos
  • Evite usar nomes de funções como:

c q t C D F I T diff df data var pt

  • O R é case-sensitive, portanto:

dados Dados DADOS

Gerenciando a área de trabalho (workspace)

Liste os objetos criados com a função ls():

R source
ls()

Para remover apenas um objeto:

R source
rm(x)

Para remover outros objetos:

R source
rm(x, y)

Para remover todos os objetos:

R source
rm(list = ls())

Cuidado! O comando acima apaga todos os objetos na sua área de trabalho sem perguntar. Depois só é possível recuperar os objetos ao rodar os script novamente.

Exercícios

  1. Armazene o resultado da equação 32 + 162 − 253 no objeto x
  2. Divida x por 345 e armazene em y
  3. Crie um objeto (com o nome que você quiser) para armazenar 30 valores aleatórios de uma distribuição uniforme entre 10 e 50
  4. Remova o objeto y
  5. Remova os demais objetos de uma única vez
  6. Procure a função utilizada para gerar numeros aleatórios de uma distribuição de Poisson, e gere 100 valores para a VA X ∼ Poisson(5).

Classes de objetos

O R possui 5 classes básicas de objetos, também chamados de objetos "atômicos":

  • character
  • numeric
  • integer
  • complex
  • logical

Um vetor só pode conter elementos de uma mesma classe

(A única excessão é a lista).

Vetor

Características:

  • Coleção ordenada de valores
  • Estrutura unidimensional

Usando a função c() para criar vetores:

R source
num <- c(10, 5, 2, 4, 8, 9)
num
R output
[1] 10  5  2  4  8  9
R source
class(num)
R output
[1] "numeric"

Por que numeric e não integer?

R source
x <- c(10L, 5L, 2L, 4L, 8L, 9L)
x
R output
[1] 10  5  2  4  8  9
R source
class(x)
R output
[1] "integer"

Para forçar a representação de um número para inteiro é necessário usar o sufixo L.

Note que a diferença entre numeric e integer também possui impacto computacional, pois o armazenamento de números inteiros ocupa menos espaço na memória. Dessa forma, esperamos que o vetor x acima ocupe menos espaço na memória do que o vetor num, embora sejam aparentemente idênticos. Veja:

R source
object.size(num)
R output
88 bytes
R source
object.size(x)
R output
72 bytes

A diferença pode parecer pequena, mas pode ter um grande impacto computacional quando os vetores são formados por milhares ou milhões de números.

Notas sobre representação numérica dentro do R

Os números que aparecem na tela do console do R são apenas representações simplificadas do número real armazenado na memória. Por exemplo,

R source
x <- runif(10)
x
R output
 [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055
 [8] 0.8924190 0.5514350 0.4566147

O objeto x contém números como 0.2875775, 0.7883051, etc, que possuem 7 casas decimais, que é o padrão do R. O número de casas decimais é controlado pelo argumento digits da função options. Para visualizar essa opção, use

R source
getOption("digits")
R output
[1] 7

Note que esse valor de 7 é o número de dígitos significativos, e pode variar conforme a sequência de números. Por exemplo,

R source
y <- runif(10)
y
R output
 [1] 0.069360916 0.817775199 0.942621732 0.269381876 0.169348123
 [6] 0.033895622 0.178785004 0.641665366 0.022877743 0.008324827

possui valores com 9 casas decimais. Isto é apenas a representação do número que aparece na tela. Internamente, cada número é armazenado com uma precisão de 22 casas decimais! Você pode ver o número com toda sua precisão usando a função print() e especificando o número de casas decimais com o argumento digits (de 1 a 22)

R source
print(x, digits = 1)
R output
 [1] 0.29 0.79 0.41 0.88 0.94 0.05 0.53 0.89 0.55 0.46
R source
print(x, digits = 7) # padrão
R output
 [1] 0.2875775 0.7883051 0.4089769 0.8830174 0.9404673 0.0455565 0.5281055
 [8] 0.8924190 0.5514350 0.4566147
R source
print(x, digits = 22)
R output
 [1] 0.28757752012461423873901 0.78830513544380664825439
 [3] 0.40897692181169986724854 0.88301740400493144989014
 [5] 0.94046728429384529590607 0.04555649938993155956268
 [7] 0.52810548804700374603271 0.89241904439404606819153
 [9] 0.55143501446582376956940 0.45661473530344665050507

Também é possível alterar a representação na tela para o formato científico, usando a função format()

R source
format(x, scientific = TRUE)
R output
 [1] "2.875775e-01" "7.883051e-01" "4.089769e-01" "8.830174e-01"
 [5] "9.404673e-01" "4.555650e-02" "5.281055e-01" "8.924190e-01"
 [9] "5.514350e-01" "4.566147e-01"

Nessa representação, o valor 2.875775e-01 = 2.875775 × 10−01 = 0.2875775.

Sequências de números

Usando a função seq()

R source
seq(1, 10)
R output
 [1]  1  2  3  4  5  6  7  8  9 10

Ou 1:10 gera o mesmo resultado. Para a sequência variar em 2

R source
seq(from = 1, to = 10, by = 2)
R output
[1] 1 3 5 7 9

Para obter 15 valores entre 1 e 10

R source
seq(from = 1, to = 10, length.out = 15)
R output
 [1]  1.000000  1.642857  2.285714  2.928571  3.571429  4.214286  4.857143
 [8]  5.500000  6.142857  6.785714  7.428571  8.071429  8.714286  9.357143
[15] 10.000000

Usando a função rep()

R source
rep(1, 10)
R output
 [1] 1 1 1 1 1 1 1 1 1 1

Para gerar um sequência várias vezes

R source
rep(c(1, 2, 3), 5)
R output
 [1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3

Para repetir um número da sequência várias vezes

R source
rep(c(1, 2, 3), each = 5)
R output
 [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3

Operações matemáticas em vetores

Operações podem ser feitas entre um vetor e um número:

R source
num * 2
R output
[1] 20 10  4  8 16 18

E também entre vetores de mesmo comprimento ou com comprimentos múltiplos:

R source
num * num
R output
[1] 100  25   4  16  64  81
R source
num + c(2, 4, 1)
R output
[1] 12  9  3  6 12 10

A Regra da Reciclagem

Regra da reciclagem

Agora tente:

R source
num + c(2, 4, 1, 3)

Exercícios

  1. Crie um objeto com os valores 54, 0, 17, 94, 12.5, 2, 0.9, 15.
  2. Some o objeto acima com os valores 5, 6.

Atributos de objetos

Os objetos possuem atributos, que servem para descrever o formato do objeto:

  • names, dimnames
  • length
  • dim
  • class

Classe:

R source
class(num)
R output
[1] "numeric"
Comprimento:
R source
length(num)
R output
[1] 6

Vetores também podem ter outras classes:

  • Vetor de caracteres:
    R source
    caracter <- c("brava", "joaquina", "armação")
    caracter
    R output
    [1] "brava"    "joaquina" "armação" 
    
  • Vetor lógico:
    R source
    logico <- caracter == "armação"
    logico
    R output
    [1] FALSE FALSE  TRUE
    
    ou
    R source
    logico <- num > 4
    logico
    R output
    [1]  TRUE  TRUE FALSE FALSE  TRUE  TRUE
    

No exemplo anterior, a condição num > 4 é uma expressão condicional, e o símbolo > um operador lógico. Os operadores lógicos utilizados no R são:

< menor
<= menor igual
> maior
>= maior igual
== igual
!= diferente
& e
| ou

Fator

Características:

  • Coleção de categorias ou níveis (levels)
  • Estrutura unidimensional

Utilizando as funções factor() e c():

R source
fator <- factor(c("alta","baixa","baixa","media",
                  "alta","media","baixa","media","media"))
fator
R output
[1] alta  baixa baixa media alta  media baixa media media
Levels: alta baixa media
R source
class(fator)
R output
[1] "factor"

Caso haja uma hierarquia, os níveis dos fatores podem ser ordenados:

R source
fator <- factor(c("alta","baixa","baixa","media",
                  "alta","media","baixa","media","media"),
                levels = c("alta","media","baixa"))
fator
R output
[1] alta  baixa baixa media alta  media baixa media media
Levels: alta media baixa

Exercícios

  1. Construa um único objeto com as letras: A, B, e C, repetidas cada uma 15, 12, e 8 vezes, respectivamente.
  2. Mostre na tela, em forma de verdadeiro ou falso, onde estão as letras B nesse objeto.
  3. Veja a página de ajuda da função sum() e descubra como fazer para contar o número de letras B neste vetor (usando sum()).
  4. Crie um objeto com 100 valores aleatórios de uma distribuição uniforme U(0, 1). Conte quantas vezes aparecem valores maiores ou iguais a 0,5.

Misturando classes de objetos

Algumas vezes isso acontece por acidente, mas também pode acontecer de propósito.

O que acontece aqui?

R source
w <- c(5L, "a")
x <- c(1.7, "a")
y <- c(TRUE, 2)
z <- c("a", T)

Lembre-se da regra:

Um vetor só pode conter elementos de uma mesma classe

Quando objetos de diferentes classes são misturados, ocorre a coerção, para que cada elemento possua a mesma classe.

Nos exemplos acima, nós vemos o efeito da coerção implícita, quando o R tenta representar todos os objetos de uma única forma.

Nós podemos forçar um objeto a mudar de classe, através da coerção explícita, realizada pelas funções as.*:

R source
x <- 0:6
class(x)
R output
[1] "integer"
R source
as.numeric(x)
R output
[1] 0 1 2 3 4 5 6
R source
as.logical(x)
R output
[1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
R source
as.character(x)
R output
[1] "0" "1" "2" "3" "4" "5" "6"
R source
as.factor(x)
R output
[1] 0 1 2 3 4 5 6
Levels: 0 1 2 3 4 5 6

De ?logical:

 Logical vectors are coerced to integer vectors in contexts where a
 numerical value is required, with ‘TRUE’ being mapped to ‘1L’,
 ‘FALSE’ to ‘0L’ and ‘NA’ to ‘NA_integer_’.
R source
(x <- c(FALSE, TRUE))
R output
[1] FALSE  TRUE
R source
class(x)
R output
[1] "logical"
R source
as.numeric(x)
R output
[1] 0 1

Algumas vezes não é possível fazer a coerção, então:

R source
x <- c("a", "b", "c")
as.numeric(x)
R warning
Warning: NAs introduced by coercion
R output
[1] NA NA NA
R source
as.logical(x)
R output
[1] NA NA NA

Valores perdidos e especiais

Valores perdidos devem ser definidos como NA (not available):

R source
perd <- c(3, 5, NA, 2)
perd
R output
[1]  3  5 NA  2
R source
class(perd)
R output
[1] "numeric"

Podemos testar a presença de NAs com a função is.na():

R source
is.na(perd)
R output
[1] FALSE FALSE  TRUE FALSE

Ou:

R source
any(is.na(perd))
R output
[1] TRUE

Outros valores especiais são:

  • NaN (not a number) - exemplo: 0/0
  • -Inf e Inf - exemplo: 1/0

A função is.na() também testa a presença de NaNs:

R source
perd <- c(-1,0,1)/0
perd
R output
[1] -Inf  NaN  Inf
R source
is.na(perd)
R output
[1] FALSE  TRUE FALSE

A função is.infinite() testa se há valores infinitos

R source
is.infinite(perd)
R output
[1]  TRUE FALSE  TRUE

Matriz

Características:

  • Podem conter apenas um tipo de informação (números, caracteres)
  • Estrutura bidimensional

Utilizando a função matrix():

R source
matriz <- matrix(1:12, nrow = 3, ncol = 4)
matriz
R output
     [,1] [,2] [,3] [,4]
[1,]    1    4    7   10
[2,]    2    5    8   11
[3,]    3    6    9   12
R source
class(matriz)
R output
[1] "matrix"

Alterando a ordem de preenchimento da matriz (por linhas):

R source
matriz <- matrix(1:12, nrow = 3, ncol = 4, byrow = TRUE)
matriz
R output
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12

Para verificar a dimensão da matriz:

R source
dim(matriz)
R output
[1] 3 4

Adicionando colunas com cbind()

R source
cbind(matriz, rep(99, 3))
R output
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4   99
[2,]    5    6    7    8   99
[3,]    9   10   11   12   99

Adicionando linhas com rbind()

R source
rbind(matriz, rep(99, 4))
R output
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   99   99   99   99

Matrizes também podem ser criadas a partir de vetores adicionando um atributo de dimensão

R source
m <- 1:10
m
R output
 [1]  1  2  3  4  5  6  7  8  9 10
R source
class(m)
R output
[1] "integer"
R source
dim(m)
R output
NULL
R source
dim(m) <- c(2, 5)
m
R output
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
R source
class(m)
R output
[1] "matrix"

Operações matemáticas em matrizes

Matriz multiplicada por um escalar

R source
matriz * 2
R output
     [,1] [,2] [,3] [,4]
[1,]    2    4    6    8
[2,]   10   12   14   16
[3,]   18   20   22   24

Multiplicação de matrizes (observe as dimensões!)

R source
matriz2 <- matrix(1, nrow = 4, ncol = 3)
matriz %*% matriz2
R output
     [,1] [,2] [,3]
[1,]   10   10   10
[2,]   26   26   26
[3,]   42   42   42

Lista

Características:

  • Pode combinar uma coleção de objetos de diferentes classes (é um tipo especial de vetor)
  • Estrutura “unidimensional”: apenas o número de elementos é contado

Utilizando a função list():

R source
lista <- list(a = 1:10, b = c("T1", "T2", "T3", "T4"), TRUE, 2 + 2)
lista
R output
$a
 [1]  1  2  3  4  5  6  7  8  9 10

$b
[1] "T1" "T2" "T3" "T4"

[[3]]
[1] TRUE

[[4]]
[1] 4
R source
class(lista)
R output
[1] "list"
R source
dim(lista)
R output
NULL
R source
length(lista)
R output
[1] 4

Formando uma lista com objetos criados anteriormente:

R source
lista <- list(fator = fator, matriz = matriz)
lista
R output
$fator
[1] alta  baixa baixa media alta  media baixa media media
Levels: alta media baixa

$matriz
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
R source
length(lista)
R output
[1] 2

Data frame

Características:

  • Uma lista de vetores e/ou fatores, de mesmo comprimento
  • Pode conter diferentes tipos de dados (numérico, fator, ...)
  • Estrutura bidimensional

Utilizando a função data.frame():

R source
da <- data.frame(ano = 2000:2004,
                 prod = c(32, 54, 25, 48, 29))
da
R output
   ano prod
1 2000   32
2 2001   54
3 2002   25
4 2003   48
5 2004   29
R source
class(da)
R output
[1] "data.frame"
R source
dim(da)
R output
[1] 5 2

Data frames podem ser formados com objetos criados anteriormente, desde que tenham o mesmo comprimento!

R source
length(num)
R output
[1] 6
R source
length(fator)
R output
[1] 9
R source
da <- data.frame(numerico = c(num, NA, NA, NA),
                        fator = fator)
da
R output
  numerico fator
1       10  alta
2        5 baixa
3        2 baixa
4        4 media
5        8  alta
6        9 media
7       NA baixa
8       NA media
9       NA media
R source
class(da)
R output
[1] "data.frame"
R source
dim(da)
R output
[1] 9 2
R source
## Estrutura dos dados
str(da)
R output
'data.frame':  9 obs. of  2 variables:
 $ numerico: num  10 5 2 4 8 9 NA NA NA
 $ fator   : Factor w/ 3 levels "alta","media",..: 1 3 3 2 1 2 3 2 2

A função str() é uma das que você precisa decorar!

Para converter um data frame para uma matriz

R source
as.matrix(da)
R output
      numerico fator  
 [1,] "10"     "alta" 
 [2,] " 5"     "baixa"
 [3,] " 2"     "baixa"
 [4,] " 4"     "media"
 [5,] " 8"     "alta" 
 [6,] " 9"     "media"
 [7,] NA       "baixa"
 [8,] NA       "media"
 [9,] NA       "media"
R source
data.matrix(da)
R output
      numerico fator
 [1,]       10     1
 [2,]        5     3
 [3,]        2     3
 [4,]        4     2
 [5,]        8     1
 [6,]        9     2
 [7,]       NA     3
 [8,]       NA     2
 [9,]       NA     2

Geralmente é o resultado de data.matrix() o qeu você está procurando.

Note que os níveis de um fator são armazenados internamente como números: 1 nível = 1, 2 nível = 2,

Nomes

Objetos do R podem ter nomes, que facilitam a auto-descrição

R source
x <- 1:3
names(x)
R output
NULL
R source
names(x) <- c("Curitiba", "Paraná", "Brasil")
x
R output
Curitiba   Paraná   Brasil 
       1        2        3 
R source
names(x)
R output
[1] "Curitiba" "Paraná"   "Brasil"  

Listas também podem ter nomes

R source
x <- list(Curitiba = 1, Paraná = 2, Brasil = 3)
x
R output
$Curitiba
[1] 1

$Paraná
[1] 2

$Brasil
[1] 3
R source
names(x)
R output
[1] "Curitiba" "Paraná"   "Brasil"  

Associando nomes às linhas e colunas de uma matriz:

R source
rownames(matriz) <- c("A","B","C")
colnames(matriz) <- c("T1","T2","T3","T4")
matriz
R output
  T1 T2 T3 T4
A  1  2  3  4
B  5  6  7  8
C  9 10 11 12

Para data frames existe uma função especial para os nomes de linhas, row.names(). Data frames também não possuem nomes de colunas, apenas nomes, já que é um caso particular de lista. Então para verificar/alterar nomes de colunas de um data frame também use names().

R source
names(da)
R output
[1] "numerico" "fator"   
R source
row.names(da)
R output
[1] "1" "2" "3" "4" "5" "6" "7" "8" "9"

Um resumo das funções para alterar/acessar nomes de linhas e colunas em matrizes e data frames.

Classe Nomes de colunas Nomes de linhas
data.frame names() row.names()
matrix colnames() rownames()

Exercícios

  1. Crie um objeto para armazenar a seguinte matriz
    $$\left[ \begin{array}{ccc} 2 & 8 & 4 \\ 0 & 4 & 1 \\ 9 & 7 & 5 \end{array} \right]$$
  2. Atribua nomes para as linhas e colunas dessa matriz.
  3. Crie uma lista com dois componentes: (1) um vetor com as letras A, B, e C, repetidas 2, 5, e 4 vezes respectivamente; (2) a matriz do exemplo anterior.
  4. Atribua nomes para estes dois componentes da lista.
  5. Inclua mais um componente nesta lista, com o nome de fator, e que seja um vetor da classe fator, idêntico ao objeto caracter criado acima (que possui apenas os nomes brava, joaquina, armação).
  6. Você contou 42 caranguejos na Joaquina, 34 no Campeche, 59 na Armação, e 18 na Praia Mole. Crie um data frame para armazenar estas informações (número de caranguejos observados e local).

Última atualização: 2015-11-18 11:07:09