Beruflich Dokumente
Kultur Dokumente
Moysés Nascimento1
1. Fundamentos da Linguagem R
1.1.Objetos do R
O R é uma linguagem baseada em objetos, ou seja, tudo que nós vamos usar no R
é armazenado na memória do computador sob a forma de um objeto. Todos os objetos
em R têm um nome associado e podem armazenar diferentes formatos, como por exemplo
números, textos, vetores, matrizes, etc. Para atribuir algo a um objeto do R, os operadores
“<-“ e “=” podem ser utilizados.
ou
peso <- 60.5
peso
[1] 60.5
1
Professor Adjunto IV, DET – UFV, CCE, Gabinete 312B. Telefone: 3899-1784. E-mail:
moysesnascim@ufv.br
1
a <- 5
z <- a^2
z
[1] 25
Para listar os objetos contidos na memória do computador pode-se fazer uso das
funções ls() ou objects(). Se o interesse é apagar algum objeto da memória usamos a
função rm() como nos exemplos apresentado sem seguida,
ls()
[1] "a""peso" "x" "z"
ou
objects()
[1] "a""peso" "x" "z"
Como resultado da função ls() observa-se os objetos que estão armazenados na memória
do R. Para remover, por exemplo, o objeto peso da memória do R, tem-se,
rm(peso)
ls()
[1] "a" "x" "z"
Observação: O nome dos objetos pode ser formado por qualquer letra maiúscula ou
minúscula, dígitos 0 a 9 (exceto no início do nome), e também o ponto final “.”. Os nomes
dos objetos em R são sensíveis às letras maiúsculas / minúsculas, ou seja, est e Est são
dois objetos diferentes para o R. Além disso, não se podem usar espaços nos nomes dos
objetos.
1.2.Vetores
Os vetores são estruturas que permitem armazenar um conjunto de valores do
mesmo tipo (por exemplo, números) sob um mesmo nome. Esses elementos podem
depois ser acessados individualmente usando um esquema de indexação (visto a frente).
No R, mesmo quando atribuímos um único número a um objeto (por exemplo,
fazendo x <-45), estamos de fato criando um vetor de números com um único elemento.
Todos os vetores em R têm um modo e um tamanho. O modo determina o tipo de
valores guardado no vetor (character: conjuntos de caracteres; logical: valores lógicos (F
ou T ou FALSE ou TRUE); numeric: números inteiros ou reais; complex: números
2
complexos). O tamanho de um vetor é o número de elementos que ele contém, e pode ser
obtido com a função length().
Para criar vetores usaremos função c() para indicar ao R os elementos que formam
o vetor separando-os por vírgulas.
peso <- c(60.5,70,69.8,101.20)
peso
[1]60.5 70.0 69.8 101.2
length(peso)
[1] 4
mode(peso)
[1] "numeric"
Observação: Todos os elementos de um vetor têm que ser do mesmo tipo (modo). Caso
tentemos criar um vetor com elementos de tipo diferente o R vai forçá-los a ser do mesmo
tipo. Considere o seguinte exemplo:
peso <- c(60.5,70,69.8,101.20,"fat")
peso
[1] "60.5""70" "69.8" "101.2" "fat"
mode(peso)
[1] "character"
Após a coerção, todos os elementos do vetor são strings2 não podendo ser
utilizados em uma expressão numérica.
Os vetores podem ter um elemento especial que é o NA (not avaliable), o qual
representa um valor desconhecido (dados perdido).
peso <- c(60.5,70,69.8,101.20,NA)
peso
[1]60.5 70.0 69.8 101.2 NA
2
Conjuntos de caracteres englobados por aspas.
3
peso[3] <- 50
peso
[1]60.5 70.0 50.0 10 1.2 NA
4
In d + e :
comprimento do objeto maior não é múltiplo do comprimento do objeto menor
1.4.Matrizes
Em R, as matrizes podem ser vistas como vetores com uma propriedade especial que
é a dimensão. Suponha que temos oito números que correspondem as produções, em kg,
de 2 genótipos em 4 ambientes.
produção < - c(10,14,9,23,42,11,23,54)
produção
[1] 10 14 9 23 42 11 23 54
dim(produção) <- c(2, 4)
produção
[,1] [,2] [,3] [,4]
[1,] 10 9 42 23
[2,] 14 23 11 54
Observe que a função dim() foi utilizada para transformar o objeto vetor produção
em um novo objeto caracterizado por uma matriz de duas linhas e quatro colunas. Outra
maneira de estabelecer um objeto matriz no R é por meio da função matrix().
produção <- matrix(c(10,14,9,23,42,11,23,54), 2, 4, byrow = T)
produção
[,1] [,2] [,3] [,4]
[1,] 10 14 9 23
[2,] 42 11 23 54
O R permite atribuir nomes aos elementos. Para tanto, basta especificar os nomes
em relação às linhas e colunas, como apresentado a seguir
rownames(produção) <- c("UFV1","UFV2")
colnames(produção) <- c("Viçosa","Coimbra","Paula Cândido","Ervália")
produção
Viçosa Coimbra Paula Cândido Ervália
UFV1 10 9 42 23
5
UFV2 14 23 11 54
produção[1,1]
[1] 10
produção[1,1:2]
Viçosa Coimbra
10 9
Se uma das dimensões for omitida obtemos todos os elementos referente ao índice
omitido.
Acessando todos elementos da coluna quatro
produção[,4]
UFV1 UFV2
23 54
produção[1,]
Viçosa Coimbra Paula Cândido Ervália
10 9 42 23
6
[,1] [,2]
[1,] 4 56
[2,] 76 12
7
Tais operações são possíveis apenas quando as dimensões das matrizes a serem
somadas ou subtraídas são iguais, ou seja, dadas as matrizes A(m x n) e B(r x s) a soma
ou subtração é possível se, e somente se, m = r e n = s.
O produto de duas matrizes é realizado por meio do produto interno do vetor
formado a partir de cada linha da matriz que pré-multiplica em relação aos vetores
formados a partir de cada coluna da matriz que pós-multiplica. Desta forma, para que a
operação seja possível é necessário que a matriz que pré-multiplica tenha tantas colunas
quando o número de linhas da matriz que pós-multiplica.
A<-matrix(c(1,2,4,3),2,2,byrow=T)
A
[,1] [,2]
[1,] 1 2
[2,] 4 3
B<-matrix(c(2,0,0,3),2,2,byrow=T)
B
[,1] [,2]
[1,] 2 0
[2,] 0 3
C<-A%*%B
C
[,1] [,2]
[1,] 2 6
[2,] 8 9
8
[3,] 8 0 6 0
[4,] 0 12 0 9
Além dessas operações podemos citar a soma direta entre duas matrizes ( ):
install.packages("Matrix")
library(matrix)
A<-matrix(c(1,2,4,3),2,2,byrow=T)
A
B<-matrix(c(2,0,0,3),2,2,byrow=T)
B
C<-bdiag(A,B)
C
9
Observação: Ordem das operações matriciais: i) parênteses, colchetes e chaves; ii)
multiplicação por escalar ou matrizes; iii) produto de Kronecker ou Hadamard; iv)
adição e subtração; v) soma direta.
1.6.Sequências
iii. Por meio da função seq() para gerar sequências de número reais. Como
por exemplo, gerar uma sequência formada pelos números começando em
-4 até 1 de 0.5 em 0.5.
seq(-4, 1, 0.5)
[1] -4.0 -3.5 -3.0 -2.5 -2.0 -1.5 -1.0 -0.50.0 0.5 1.0
Observação: Esta função tem várias outras possibilidades. Para explorá-las, usamos a
ajuda do R digitamos o comando ?seq que mostra o help (ajuda) relativo á função seq().
iv. Por meio da função rep() para gerar sequências de números repetidos.
Considera a geração de uma sequência formada por 10 números iguais a
5.
rep(5, 10)
5 5 5 5 5 5 5 5 5
10
Outro exemplo seria gerar uma sequência formada 2 níveis (sim e não)
cada um com 5 repetições.
gl(2, 5, labels = c("nao", "sim"))
[1] não não não não nao sim sim sim sim sim
Levels: nao sim
11
1.7.Indexação
O R permite usar vetores dentro dos colchetes que indicam o elemento do vetor.
Estes vetores se chamam vetores de índices. Um tipo de vetor, já discutido anteriormente
é denominado vetor lógico. Esses são resultado da avaliação de uma condição em relação
a cada elemento do vetor. Como por exemplo:
x<-c(-20,3,-4,35,50)
x
[1] -20 3 -4 35 50
x>0
[1] FALSE TRUE FALSE TRUE TRUE
Podemos guardar este vetor lógico em um objeto z e utilizar esse vetor como um
vetor de índices obtendo então os elementos de x que são maiores que zero.
z<-x>0
z
[1] FALSE TRUE FALSE TRUE TRUE
x[z]
[1] 3 35 50
x[x>0]
[1] 3 35 50
Por meio de operadores lógicos disponíveis no R, tais como “|”3 e “&’ que
correspondem à disjunção (OU) e conjunção (E), respectivamente, podemos construir
vetores de indexação lógicos mais complexos, como por exemplo:
x
[1] -203 -4 35 50
x[x<=-20|x>35]
[1] -20 50
[1] 3 35
3
Existem variantes “| |” e “&&’ que também correspondem à disjunção (OU) e conjunção (E),
porém com algumas diferenças que serão abordadas posteriormente.
12
Essa instrução fornece como resultado os elementos de x que são maiores que 0
e menores que 40.
Podemos também usar um vetor de números inteiros como índice de outro vetor.
Os números desse vetor de índices correspondem aos elementos a extrair do outro vetor.
Por exemplo:
v<-c("um","dois","três","quatro","cinco","seis")
v[c(2,4)]
v[1:3]
Podemos indexar o vetor com strings por meio da função names(). Se tivermos
um vetor com as produções, em toneladas, de três estados brasileiros podemos criar um
vetor com nomes da seguinte forma:
produçao<-c(40,30,25)
names(produçao)<-c("Minas Gerais","Bahia","Pará")
produçao
40 30 25
1.8.Fatores
13
r
r<-factor(r)
Suponha agora que temos 2 novos animais, cuja raça também pretendemos
armazenar. Imagine que por coincidência todos pertencem à raça pial. Se pretendemos
que o fator resultante mantenha os 2 níveis possíveis para a raça de um animal teremos
que fazer,
outro.r<- factor(c("pial", "pial"), levels = c("pial", "comercial"))
utro.r
comercial pial
2 2
A função table() também permite tabulações cruzadas de dois fatores, desde que
estes tenham o mesmo tamanho. Imaginemos que temos outro vetor referente à idade dos
animais. Podemos construir uma tabela cruzada da idade e da raça dos 10 animais, da
seguinte forma:
idade<-factor(c("adulto", "adulto", "jovem", "jovem))
idade
table(r,idade)
14
idade
r adulto jovem
comercial 1 1
pial 1 1
tabela.cruzada<- table(r,idade)
margin.table(tabela.cruzada, 1)
comercial pial
2 2
idade
r adulto jovem
Para a obtenção das frequências relativas em relação ao total por linha fazemos:
prop.table(tabela.cruzada, 1)
idade
r adulto jovem
Para a obtenção das frequências relativas em relação ao total por colunas basta
alterar na função anterior o número 1 por 2.
1.9. Arrays
15
São extensões das matrizes, ou seja, objetos que podem ter vários índices. A
criação de um array pode ser realizado por da função array(). Exemplo:
array<-array(1:30, dim= c(2, 5, 3))
array
, , 1
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
, , 2
[1,] 11 13 15 17 19
[2,] 12 14 16 18 20
, , 3
[1,] 21 23 25 27 29
[2,] 22 24 26 28 30
[1,] 11 13 15 17 19
[2,] 12 14 16 18 20
1.10. Listas
Podemos armazenar os objetos em uma lista e estes não necessitam ser do mesmo
tipo, modo ou tamanho. Os componentes de uma lista em R são sempre numerados e
podem também ter um nome associados a eles (exemplo: saídas de funções do R).
Vejamos um exemplo de criação de uma lista em R:
estudante <- list(matricula = 34453, nome = "Zezinho", notas = c(20,15,40))
estudante
16
$matricula
[1] 34453
$nome
[1] "Zezinho"
$notas
[1] 20 15 40
[1] 34453
estudante[[2]]
[1] "Zezinho"
ou
estudante$nome
[1] "Zezinho"
estudante
$matricula
[1] 34453
$nome
[1] "Zezinho"
$notas
[1] 20 15 40
$pais
17
notas.inform <- data.frame(mat = c(2355, 3456, 2334, 5456),
notas.inform
1 2355 t1 10.3
2 3456 t2 9.3
3 2334 t3 14.2
4 5456 t4 15.0
Podemos acessar elementos do uma data frame da mesma forma que em matrizes.
Adicionalmente, as colunas da data frame podem ser acessadas na sua totalidade usando
o seu nome,
notas.inform[2, 2]
[1] t2
Levels: t1 t2 t3 t4
Note que a função data.frame() transformou a coluna turma num fator. Isto é feito
sempre que os elementos de uma coluna sejam todos do tipo string.
Usando os esquemas de indexação podemos fazer consultas aos dados guardados
numa data frame. Exemplos:
notas.inform[notas.inform$notas > 10, ]
1 2355 t1 10.3
3 2334 t3 14.2
4 5456 t4 15.0
As consultas a data frames apresentadas acima, podem ser simplificadas por meio
do uso da função attach(). Esta função permite acessar os valores nas colunas de uma data
frame sem a necessidade de colocar o nome deste atrás do nome da coluna, como feito
nos exemplos acima. Vejamos como isto funciona,
attach(notas.inform)
18
notas.inform[notas > 14, ]
3 2334 t3 14.2
4 5456 t4 15.0
turma
[1] t1 t2 t3 t4
Levels: t1 t2 t3 t4
Devemos usar a função detach() quando não precisamos mais deste acesso
“direto” `as colunas.
detach(notas.inform)
turma
Em geral não vamos escrever os dados numa data frame “`a mão” usando a função
data.frame(), como feito anteriormente. Na maioria das vezes buscamos os dados ou a
uma base de dados, ou em um ficheiro de texto, ou mesmo a uma fonte de dados
disponível na Internet.
19