Você está na página 1de 20

Manual de R


Luı́s Ramos

2 de Novembro de 2018

Resumo
O R é um software para tratamento estatı́stico de distribuição gratuita. Pode ser
instalado em windows, MacOS e em várias distribuições do sistema UNIX. Pretende-se
com este manual fornecer um guia que permita uma fácil integração com o software
R na disciplina de Estatı́stica Aplicada.

1 Introdução
O software R é uma aplicação de distribuição gratuita que permite fazer análises es-
tatı́sticas de dados. Este texto, ainda em construção, constitui um guia para a disciplina de
Estatı́stica Aplicada. A página principal do projecto é http://www.r-project.org. O pro-
grama e alguns manuais podem ser descarregados da página http://neacm.fe.up.pt/CRAN.

1.1 Ambiente de trabalho em Windows


O R utiliza uma linha de comandos designada por consola onde se introduzem os comandos
que permitem fazer a análise estatı́stica dos dados. Outra forma de trabalhar em R é
escrever um script em modo de texto com um editor de preferência em ASCII, por exemplo
o ”Notpad”. Desde já desaconselhamos a utilização de editores como o ”Wordpad”que
inserem de forma não visı́vel caracteres que darão erro na execução do script. Pode-se
utilizar também um editor especı́fico para o R, por exemplo o R-WinEdt que pode ser
instalado através da opção ”Load packages”no menu ”Packages”.
O R utiliza uma directoria de trabalho, que por defeito será a directoria de instalação.
Para se poder trabalhar com uma outra directoria, deve-se escolher em ”Change dir ...”no
menu ”File”a directoria pretendida. Este procedimento terá de ser feito cada vez que se
corre o R. Para evitar isto pode-se criar um atalho definindo em propriedades a directoria
de inı́cio para a directoria pretendida. Outra forma é utilizar nos scripts o comando
setwd(”C:/caminho da dir de trabalho”).

1.2 Ajuda no R
Para obter uma lista de funções relacionadas com uma palavra-chave, podemos utilizar o
comando

Faculdade de Ciências e Tecnologia, Universidade Nova de Lisboa, 2018

1
> help.search(”palavra − chave”)

Caso se pretenda obter uma janela de diálogo com a informação duma função podemos
utilizar a sintaxe

>help(função)

Nas janelas de ajuda das funções pode-se encontrar uma função ou lista de funções re-
lacionadas, por vezes mais apropriadas para a tarefa pretendida. Outra função útil para
ajuda é a função apropos(conceito) que nós dá a informação sobre todas as funções do R
que envolvam conceito.

1.3 Execução de comandos dum ficheiro externo


Se os comandos forem guardados num ficheiro externo, designado por ”comandos.r”na di-
rectoria de trabalho, estes podem ser executados recorrendo ao menu (file, source R code
...) ou utilizando o comando

> source(”comandos.r”)

Deve-se substituir ”comandos.r” por ”DRIVE:/caminho/comandos.r” caso o ficheiro com


as linhas de comandos não se encontre na directoria de trabalho.

2 Comandos elementares
O R pode ser utilizado para fazer operações aritméticas

> 6 + 10 ∗ 3 − 1
[1] 35

podendo-se, por exemplo atribuir (<− ) o resultado anterior a um escalar (objecto) através
da sintaxe

> a <− 6 + 10 ∗ 3 − 1

Uma forma alternativa para atribuir o resultado duma operação aritmética ou o conteúdo
de um objecto é

> 6 + 10 ∗ 3 − 1 −> a

Observe que o R distingue letras minúsculas de maiúsculas, sendo necessário ter cui-
dado na definição dos nomes dos vários objectos. Para se ter uma ideia dos objectos já
utilizados podemos utilizar a seguinte função com a lista de argumentos vazia

> ls()

2
Outra funcionalidade interessante desta função é a impressão na consola da lista de funções
dos ”packages”, bastando para isso indicar um inteiro 1, 2, ... como argumento.

Quando se atribui o resultado duma operação aritmética a um objecto, este armazena


esse resultado mas não será imediatamente visı́vel, sendo necessário escrever o nome desse
objecto na linha de comandos para se ter acesso à informação armazenada pelo objecto.
Pode-se contornar isto utilizando a seguinte sintaxe

> (x <− 2 + 1)
[1] 3

Caso se esteja a correr um script e se pretenda que os resultados das operações aritméticas
sejam, para além de ser atribuı́dos a um objecto, apresentados na consola, deve-se utilizar,
por exemplo

> print(x <− 2 + 1)


[1] 3

3 Operações aritméticas e funções de cálculo


Podemos utilizar as seguintes operações aritméticas e algumas funções conhecidas do
cálculo analı́tico

Operação e/ou função comando


Soma +
Diferença −
Multiplicação ∗
Divisão /
Potência b
Raiz quadrada sqrt()
Módulo abs()
Logaritmos log(), log10(), log2(), logb (x, base)
Exponencial exp()
Trigonométricas sin(), cos(), tan()
Arredondamento de x com n casas decimais round(x,n)
Arredondamento de x, por excesso, à unidade ceiling(x)
Outras max(), min(), range(), rank(),
mean(), sum(), var(), sd(),
prod(), sort(), order(), summary(), etc.

3
4 Objectos, o seu tipo e atributos
4.1 Atributos: tipo e tamanho
O R tem uma estrutura orientada por objectos. Por exemplo, temos valores reais, vectores
reais, valores complexos, vectores complexos, vectores de elementos booleanos, vectores de
caracteres e arrays, objectos cujos elementos são todos do mesmo tipo, sendo os vectores
do tipo numérico, complexo, booleano, caracter, etc... Para este tipo de objectos existe,
aparentemente, uma excepção que é um ”valor especial”designado por NA para quanti-
dades não disponı́veis. Note-se que um vector pode ser vazio e ainda possuir um tipo.
O R também opera com objectos chamados listas, os quais são do tipo ”list”. Estas são
sequências ordenadas de objectos, podendo ser de vários tipos.
Outro tipo de objectos são as funções que fazem parte do R, bem como aquelas que po-
derão ser definidas pelo utilizador.
As funções mode(object) e length(object) podem ser utilizadas para obter o tipo e tama-
nho de uma qualquer estrutura definida. Outras propriedades dum objecto são usualmente
obtidas por attributes(object).
Por exemplo, se z é um vector complexo definido por

> (z <− c(2 + 1i, 1i))


[1] 2 + 1i 0 + 1i

> mode(z)
[1] ”complex”

> length(z)
[1] 2

a função mode(z) devolve o valor ”complex”e a função length(z) o valor 2.


O R permite fazer mudanças de tipo para alguns tipos de objectos. Por exemplo, podemos
obter do vector z, definido atrás, um vector d do tipo caracter

> (d <− as.character(z))


[1] ”2 + 1i” ”0 + 1i”

e do vector d podemos obter um vector zz igual a z executando o comando

> zz <− as.complex(d)


> zz
[1] 2 + 1i 0 + 1i

Existe uma larga colecção de funções da forma as.xxx() para converter objectos de um
tipo para outro, ou, para fornecer a um objecto com um qualquer atributo um outro que
ele não possui. Um exemplo interessante da necessidade de fornecer um atributo a um
objecto é a função dim(), que pode ser utilizada com vectores, sendo necessário atribuir
ao objecto vector o atributo ”dim”de um array, utilizando-se para tal a função as.array(),
de forma a que esta devolva um valor diferente de ”NULL”

4
> x <− c(1, 2, 3)
> dim(x)
N U LL

> dim(as.array(x)
[1] 3

4.2 Mudança de tamanho de um objecto


Um objecto ”vazio”poderá ainda ser de algum tipo. Por exemplo

> a <− numeric()

constrói um vector vazio do tipo numérico.


Uma vez criado um objecto para qualquer tamanho, novas componentes podem ser adici-
onadas, atribuindo o valor pretendido para uma dada componente do vector indexado à
ordem dessa componente. Assim,

> a[3] <− 1


> a
[1] N A N A 1

obtém-se um vector numérico de tamanho 3. O tamanho do vector a é ajustado de forma


automática. Por outro lado para truncar o tamanho, por exemplo, do objecto ”a” a 2,
basta escrever

> length(a) <− 2


> a
[1] N A N A

e assim foi eliminado o terceiro elemento. Pode-se também usar a função length() para
alargar a dimensão dum dado objecto, sendo neste caso atribuı́do às novas componentes
o valor ”NA”.

5 Vectores
O vector é uma colecção ordenada de elementos do mesmo tipo.

5.1 Criação e manipulação de vectores


Podemos criar um vector recorrendo à função de concatenação c()
> x <− c(2, 3, 5, 4, 9)

obtendo-se o seguinte resultado

5
> x
[1] 2 3 5 4 9

As seguintes linhas de comandos são úteis para atribuir a um vector uma parte ou trans-
formações do vector x

> print(y <− x[3 : 5])


[1] 5 4 9

> print(y <− x < 4)


[1] T RU E T RU E F ALSE F ALSE F ALSE

> print(y <− x[x < 4])


[1] 2 3

> print(y <− c(x, 0, x))


[1] 2 3 5 4 9 0 2 3 5 4 9

No exemplo

> print(y <− 2 ∗ x + 10)


[1] 14 16 20 18 28

as operações são calculadas elemento a elemento sobre o vector x. O mesmo se passa


no exemplo seguinte com o operador ”b”, sendo a operação feita elemento a elemento

> print(y <− xb2)


[1] 4 9 25 16 81

em vez de xb2 podı́amos utilizar x ∗ x, onde ∗ não representa o produto matricial, mas
o produto elemento a elemento, sendo o resultado um vector com elementos obtidos pelo
quadrado elemento a elemento das componentes do vector x.
O produto matricial de vectores é feito utilizando-se o operador % ∗ %, ficando ilustrado
pelo exemplo seguinte, onde t(x) representa a transposta do vector x

> print(y <− t(x)% ∗ %x)


[, 1]
[1, ] 135

5.2 Algumas funções auxiliares na criação de vectores


As funções seq() e rep() são úteis na criação de vectores. Vejamos alguns exemplos

Sequência de valores de 3 a 8
> print(a <− 3 : 8)
[1] 3 4 5 6 7 8

A função seq() permite gerar sequências de valores. Os comandos seq(1,5), seq(from=1,

6
to=5) e seq(to=5, from=1) produzem o mesmo resultado que 1:5, isto é, o vector c(1, 2, 3, 4, 5).
Outros exemplos da utilização desta função são

> s <− seq(−1, 1, by = .5)


> s
[1] − 1.0 − 0.5 0.0 0.5 1.0

gerando em s um vector c(−1.0, −0.5, 0.0, 0.5, 1.0). De forma similar temos

> seq(length = 5, f rom = −1, by = .5)


[1] − 1.0 − 0.5 0.0 0.5 1.0

gerando o mesmo vector. O comando seq(-1,1,0.5) produz também o mesmo resultado.


Outra função importante na criação de vectores é a função rep() que permite criar vecto-
res através da repetição de um único elemento ou dos elementos de um vector. Vejamos
alguns exemplos

> x <− c(1, 2)


> rep(x, times = 5)
[1] 1 2 1 2 1 2 1 2 1 2

> rep(x, 5)
[1] 1 2 1 2 1 2 1 2 1 2

Podemos também repetir os elementos dum objecto, mas desta vez tendo em conta a
ordem deles nesse objecto, utilizando o comando

> rep(x, each = 5)


[1] 1 1 1 1 1 2 2 2 2 2

obtendo-se o vector resultante de 5 repetições de cada um dos elementos do vector x,


por ordem das componentes deste.

6 Arrays e matrizes
6.1 Array
Um array pode ser considerado como uma colecção de dados, por exemplo do tipo numérico,
à qual se associa um vector de dimensões. O R permite criar com facilidade arrays e, em
particular, matrizes. Uma matriz é um array definido por um vector de 2 dimensões. Se
a dimensão for k então temos um array k-dimensional, isto é, ao qual está associado um
vector de dimensões de tamanho k. As dimensões de um array são indexadas desde um
até ao número de elementos dados por um vector. Vejamos o exemplo,

> z <− 1 : 24

onde o objecto z é um vector com 24 elementos. A função dim() vai atribuir a z o

7
atributo de array, atribuindo-lhe um vector de dimensões c(3,4,2)

> dim(z) <− c(3, 4, 2)

passando a ser um array do tipo 3 × 4 × 2. Outras funções tais como matrix() e array()
podem ser usadas para criar de forma mais simples e natural arrays de k dimensões. Por
exemplo, se for c(3,4,2), o vector de dimensões para um array, então temos 3 × 4 × 2 = 24
entradas e o vector de dados, associado ao array, constituı́do pelos valores ordenados
a[1, 1, 1], a[2, 1, 1], a[3, 1, 1], ..., a[1, 4, 2], a[2, 4, 2], a[3, 4, 2].
Um array pode ter uma única dimensão, tal array é normalmente tratado como um vector.

6.2 Indexando arrays. Subsecção dum array


Um elemento de um array pode ser referenciado pelo nome do array e entre parêntesis
rectos e separando por vı́rgulas os números que indicam a sua posição no array. De forma
mais geral, subsecções de um array podem ser especificadas dando uma sequência de vecto-
res de ı́ndices, contudo se um ı́ndice de posição é dado por um vector de ı́ndices vazio, então
todo o conjunto de dados correspondentes é considerado. Continuando o exemplo anterior,
a[2, , ] é um array do tipo 4 × 2 com vector de dimensões c(4, 2) e vector de dados contendo
os valores c(a[2, 1, 1], a[2, 2, 1], a[2, 3, 1], a[2, 4, 1], a[2, 1, 2], a[2, 2, 2], a[2, 3, 2], a[2, 4, 2]) nesta
ordem, onde a[, , ] corresponde a todo o array, sendo o mesmo que utilizar apenas o nome
a. Para qualquer array, digamos z, o vector de dimensões pode ser obtido com dim(z) e o
vector de dados pelo comando z[1 : n], com n o número de elementos do vector de dados
do array.

6.3 Matrizes de ı́ndices


As matrizes de ı́ndices permitem-nos obter colecções de dados de arrays ou modificar um
conjunto de dados com uma única entrada. Suponhamos por exemplo que temos um array
X de 3 × 3 e querı́amos extrair os elementos X[1, 3], X[2, 2] e X[3, 1] como um vector e
substituir essas entradas no array X por zeros. Vamos então considerar o array

> X <− array(1 : 9, dim = c(3, 3))


> X

[, 1] [, 2] [, 3]
[1, ] 1 4 7
[2, ] 2 5 8
[3, ] 3 6 9
e a matriz de ı́ndices, isto é, o array i de 3 × 2

> i <− array(c(1 : 3, 3 : 1), dim = c(3, 2))


> i

[, 1] [, 2]
[1, ] 1 3
[2, ] 2 2
[3, ] 3 1

8
Podemos assim extrair os elementos pretendidos utilizando

> X[i]
[1] 7 5 3

Vamos agora substituir esses elementos por zeros

> X[i] <− 0


> X

[, 1] [, 2] [, 3]
[1, ] 1 4 0
[2, ] 2 0 8
[3, ] 0 6 9

Índices negativos não são permitidos nas matrizes de ı́ndices. ”NA”e zeros são permitidos,
entradas na matriz de ı́ndices contendo zeros são ignoradas e contendo ”NA”produzem
”NA”como resultado.

6.4 A função array


Os arrays podem ser construı́dos com base em vectores através da função array() da se-
guinte forma

X <− array(vector dados, vector dim)

Por exemplo, dado o vector b com 12 ou mais elementos, o comando

X <− array(b, dim = c(3, 4))

utiliza b para construir um array em X do tipo 3 × 4. Se b tiver tamanho inferior a


12, os seus valores são reciclados desde o inı́cio. Exemplifiquemos

> X <− array(1 : 12, dim = c(3, 4))


> X

[, 1] [, 2] [, 3] [, 4]
[1, ] 1 4 7 10
[2, ] 2 5 8 11
[3, ] 3 6 9 12

Neste caso, o vector ”1:12”e o vector de dados do array X têm o mesmo número de
elementos. Se em vez de um vector com 12 elementos tivermos um vector com número de
elementos inferior a 12, por exemplo, o vector 1 : 10, o array X de 3 × 4 é construı́do na
mesma, mas os últimos dois elementos obtidos na construção de X são os dois primeiros
elementos do vector 1 : 10

9
> X <− array(1 : 10, dim = c(3, 4))
> X

[, 1] [, 2] [, 3] [, 4]
[1, ] 1 4 7 10
[2, ] 2 5 8 1
[3, ] 3 6 9 2

Esta forma de construção de arrays, fazendo reciclagem, pode ser muito útil, caso preten-
damos um array cujos elementos sejam todos iguais. Para tal basta, por exemplo, utilizar
o comando

> X <− array(0, dim = c(3, 4))

para obter um array com elementos todos nulos. Neste ponto dim(X) dá-nos o vec-
tor de dimensões de X e X[1 : 12] o vector de dados do array.
Arrays podem ser utilizados em operações numéricas, sendo o resultado um array obtido
pelas operações elemento a elemento dos vectores de dados que lhe estão associados. Em
geral o atributo ”dim”deverá ser o mesmo para todos os array, sendo este atributo o
mesmo no resultado final da operação. Vejamos o seguinte exemplo

> X <− array(1 : 4, dim = c(2, 2))


> X

[, 1] [, 2]
[1, ] 1 3
[2, ] 2 4
> Y <− array(c(10, 20, 30, 40), dim = c(2, 2))
> Y

[, 1] [, 2]
[1, ] 10 30
[2, ] 20 40
> D <− 2 ∗ X + Y + 100
> D

[, 1] [, 2]
[1, ] 112 136
[2, ] 124 148
> dim(D)
[1] 2 2

Assim D é um array do mesmo tipo que X e Y ,isto é, com o mesmo vector de dimensões
c(2,2), contendo um vector de dados resultante das operações elemento a elemento. Con-
tudo a mesma regra considerando operações entre array e vectores tem de ser considerada
com um pouco mais de cuidado.

10
6.5 Matrizes
Tal como já foi referido, uma matriz é um caso especial de um array. Devido à sua
importância, precisa ser abordado separadamente, uma vez que o R contém ferramentas,
operadores e funções, que apenas são utilizadas para este caso especial de arrays. Por
exemplo as funções nrow() e ncol() que definem ou identificam o número de linhas e
colunas de uma matriz, respectivamente.

6.5.1 Produto matricial

O operador % ∗ % é utilizado para o produto matricial. Uma matriz de n × 1 ou 1 × n pode


ser usada como um vector de n elementos caso seja apropriado. Inversamente, vectores
que apareçam em produtos matriciais são automaticamente tratados como uma matriz
linha ou coluna para o qual o produto seja, se possı́vel, coerente.
Se, por exemplo, A e B são duas matrizes quadradas de igual ordem, então

> A∗B

é uma matriz quadrada obtida pelos produtos elemento a elemento, e

> A %∗% B

é o produto matricial. Se x é um vector, então

> x % ∗ % A% ∗ % x

é uma forma quadrática.


A função crossprod() permite fazer certos produtos matriciais, isto é, crossprod(A, x) faz
o mesmo que t(A)% ∗ %x mas de forma mais eficiente. Se o segundo elemento da função
for omitido, esta toma o primeiro para segundo argumento. Há funções que podem operar
de diferentes formas conforme o tipo(s) de argumento(s) que nela figure(m). Por exem-
plo, a função diag(), onde, dado um vector x, diag(x) devolve uma matriz diagonal cujos
elementos da diagonal são os elementos do vector x, dado A uma matriz, diag(A) dá-nos
um vector com os elementos da diagonal de A. Se utilizarmos o comando diag(k), com k
um valor numérico positivo, obtemos a matriz identidade de ordem igual ao valor inteiro
de k.

6.5.2 Equações lineares e inversa

Para resolver o sistema de equações lineares, em R, definido pela expressão Ax = b, dada


a matriz A dos coeficientes e o vector dos termos independentes, b, podemos utilizar a
função solve() da seguinte forma

> solve(A, b)

devolvendo x (pelo menos aproximadamente). Observe que em álgebra linear, formal-


mente tem-se x = A−1 b, onde A−1 denota a inversa de A, a qual pode ser calculada
utilizando solve(A), mas raramente é necessária. Numericamente esta última forma é ao

11
mesmo tempo ineficiente e potencialmente instável, quando se utiliza

> x <− solve(A)% ∗ % b

em vez de

> x <− solve(A, b).


0
A forma quadrática x A−1 x que é utilizada em cálculo multivariado, deverá ser calcu-
lado, por exemplo, como

> x % ∗ % solve(A, x)

em vez de calcular a inversa de A.

6.5.3 Valores e vectores próprios

...

7 Listas e data frames


7.1 Lista
Uma lista em R é um objecto que consiste numa colecção ordenada de objectos conhecidos
como as suas componentes. Nas listas as componentes não têm de ser necessariamente do
mesmo tipo, e, por exemplo, uma lista pode conter vectores numéricos, valores booleanos,
matrizes, vectores complexos, arrays de caracteres, funções, etc... Um exemplo de uma
lista poderá ser

> l < − list(nome = ”P edro”, apelido = ”P ereira”, idade = 30, tel.numeros =


c(221234567, 961234567))

As componentes são sempre numeradas e podem ser sempre referidas pela sua ordem.
Assim, no exemplo anterior podemos chamar individualmente as componentes da lista l
por l[[1]], l[[2]], l[[3]] e l[[4]], e, caso se queira chamar o primeiro elemento da componente
número 4 da lista l, isto é, o primeiro elemento do vector tel.numeros, devemos utilizar
l[[4]][1].
As componentes de uma lista podem ter nomes. Tal como se pode ver no exemplo as
componentes têm os nomes: nome, apelido, idade e tel.numeros. Neste caso pode-
mos chamar qualquer das componentes da lista l pelo seu nome, utilizando o comando
l$nome da componente ou l[[”nome da componente”]]. No exemplo anterior l[[1]][1],
l$tel.numeros[1] e l[[”tel.numeros”]][1] são iguais e devolvem o valor 221234567. Isto é
especialmente útil, quando o nome da(s) componente(s) estão armazenados numa variável
ou vector, como se vê no exemplo a seguir

> x <− c(”nome”, ”apelido”, ”tel.numero”)


> l[[x[1]]]

12
[1] ”P edro”

> l[[x[2]]]
[1] ”P ereira”

> l[[x[3]]]
[1] 221234567 961234567

É importante distinguir l[[1]] de l[1]. ”[[...]]”é o operador utilizado para seleccionar um


simples elemento, enquanto ”[...]”é um operador geral de subscrição. Assim, l[[1]] é o
primeiro objecto da lista l, e, no caso de uma lista com componentes nomeadas, esta in-
formação não é incluı́da. A segunda forma, l[1] é uma sub-lista de l. Por exemplo l[c(1, 2)]
devolve-nos uma lista constituı́da pelos dois primeiros objectos, o que poderia ser útil se
pretendêssemos apenas trabalhar com as primeiras duas componentes da lista l.
O comando names(l), no caso das componentes da lista l estarem nomeadas, devolve
um vector com os nomes dessas componentes, que no exemplo em estudo é o vector
c(”nome”,”apelido”,”idade”,”tel.numeros”). O comando length(l) dá-nos o número de
componentes da lista l, sendo neste caso 4.

7.2 Construção e modificação de listas


As listas podem ser construı́das a partir de objectos existentes através da função list(). O
comando

> l <− list(nome 1 = objecto 1, ..., nome m = objecto m)

cria uma lista l com m componentes utilizando m objectos e atribuindo-lhe um nome.


Se estes nomes forem omitidos, as componentes apenas são numeradas. As componentes
usadas para a construção da lista são copiadas quando é construı́da a nova lista e os ori-
ginais não são alterados. As listas existentes podem ser expandidas por especificação de
componentes adicionais. Por exemplo,

> l[5] <− list(morada = ”Rua das f lores”)

adiciona uma quinta componente à lista do exemplo anterior.


Quando utilizamos a função c() com listas como argumentos, o resultado é também uma
lista, cujas componentes correspondem ao conjunto de todas as componentes das listas,
agrupadas por ordem da lista de argumentos da função c().

> lista.ABC <− c(lista.A, lista.B, lista.C).

7.3 Data frames


Um data frame é uma lista com caracterı́sticas especiais. Para trabalhar com data frames
temos de fazer algumas restrições na forma como se trabalha com listas.

• As componentes têm de ser vectores (numéricos, caracteres, booleanos), factores,

13
matrizes numéricas, listas, ou outros data frames.

• Matrizes, listas e data frames fornecem tantas variáveis ao novo data frame quantas
colunas, elementos, ou, variáveis elas tenham respectivamente.

• Vectores que apareçam como variáveis de um data frame têm de ter todos o mesmo
número de elementos, e matrizes tem de ter o mesmo número de linhas.

Um data frame pode ser tratado, para algumas utilizações, como uma matriz, embora
os atributos não sejam os mesmos. Pode ser apresentado na forma de matriz, e, as suas
linhas e colunas, extraı́das utilizando a indexação convencional de matrizes.

7.3.1 Construção de data frames

Objectos satisfazendo as restrições sobre as colunas (componentes) de dados podem ser


utilizados para construir um data frame recorrendo à função data.frame(). Por exemplo,

> d <− data.f rame(i = 1 : 3, l = LET T ERS[1 : 3])


> d

i l
1 1 A
2 2 B
3 3 C
> names(d)
[1] ”i” ”l”

Também se podia utilizar o comando na forma

> d <− data.f rame(1 : 3, LET T ERS[1 : 3])

mas, neste caso, não atribuı́amos o nome às colunas do data frame, ficando estas com
nomes definidos pelo R, sendo, neste exemplo,

> names(d)
[1] ”X1.3” ”LET T ERS.1.3.”

Uma lista cujas componentes estão de acordo com as restrições impostas sobre os data
frames podem ser convertidas utilizando a função as.data.frame(). Uma forma simples de
construir um data frame é através da função read.table(), que permite ler um conjunto de
dados dum ficheiro externo. Esta função será abordada na secção: Leitura de ficheiros de
dados.

7.3.2 As funções attach() e detach()

As notações $, utilizadas, por exemplo, em l$nome, l$aplido na lista l, são por vezes
pouco convenientes. Uma funcionalidade útil é tornar as componentes de uma lista, ou
data frame temporariamente visı́veis como variáveis definidas sobre o nome das suas com-
ponentes, sem ter necessidade de indicar explicitamente o nome da lista, ou data frame, a

14
que pertencem.
A função attach() pode ser utilizada para tornar visı́vel as componentes de uma lista ou
data frame. Vejamos o exemplo anterior

> d <− data.f rame(i = 1 : 3, l = LET T ERS[1 : 3])


> i
Error : object ”i” not f ound

> attach(d)
> i
[1] 1 2 3

A função detach() faz o inverso, tornando invisı́vel as componentes de listas ou data frames
que a função attach() tornou visı́veis.
A função attach() permite tornar visı́vel as componentes de uma lista ou data frame,
chamando-as pelos respectivos nomes. Contudo não é possı́vel modificar essas componen-
tes sem necessidade de especificar o nome da lista ou data frame, isto é, se no exemplo
anterior pretendêssemos modificar a componente i de 1 : 3 para c(2, 4, 6) terı́amos de es-
crever

> d$i <− c(2, 4, 6).

8 Algumas funções úteis


8.1 A função sum
Esta função é de grande utilidade, pois permite, com alguma facilidade, fazer contagens,
calcular as somas das observações duma amostra, etc... Vamos ver alguns exemplos utili-
zando a função sum(). Assim,

> x <− c(1, 5, 3, 4, 2)


> sum(x)
[1] 15

permite obter a soma dos elementos do vector x. Com

> sum(x < 4)


[1] 3

obtemos o número de elementos de x inferiores a 4. Repare-se que o que a função sum()


faz internamente é somar os valores do vector booleano x < 4. Vejamos o exemplo em baixo

> x<4
[1] T RU E F ALSE T RU E F ALSE T RU E

> sum(c(T RU E, F ALSE, T RU E, F ALSE, T RU E))


[1] 3

15
Às componentes com valor lógico ”TRUE” é atribuı́do o valor 1, e às componentes
”FALSE” o valor 0, para que a soma dessas componentes corresponda ao número de
componentes com valor lógico verdadeiro. Se por outro lado utilizarmos o comando

> sum(x[x < 4])


[1] 6

obtemos a soma das componentes do vector x que sejam inferiores a 4. Observe-se neste
caso que o vector que dá entrada como argumento da função sum() é c(1, 3, 2).

8.2 A função summary


...

9 Agrupamentos, Ciclos e Condições


...

10 Leitura de ficheiros de dados


Grandes quantidades de dados, frequentemente, são lidos de ficheiros de dados externos, em
vez de serem introduzidos na linha de comandos. O R fornece funções de entrada de dados,
sendo os seus requisitos um pouco inflexı́veis. Existe claramente, por parte dos criadores do
R, a ideia que os utilizadores podem modificar, utilizando editores, os ficheiros de entrada
por forma a estes estarem de acordo com os requisitos exigidos pelas funções de entrada
de dados. Trata-se de facto de uma operação simples. No caso de as variáveis estarem
definidas em data frames, recomenda-se a utilização da função read.table(). Existem
funções mais primitivas, como por exemplo a função scan().

10.1 A função read.table


Para ler um data frame directamente, o ficheiro terá de estar normalmente na seguinte
forma:

• A primeira linha do ficheiro com os nomes de cada variável do data frame;

• Cada linha adicional tem como primeiro elemento a descrição da linha e os valores
para cada uma das variáveis.

Assim, um ficheiro contendo um data frame poderá ser da forma

16
Nome Apelido Casado Telefone
01 Jose Dias TRUE 212233449
02 Carla Sousa FALSE 224478442
03 Rosa Pereira TRUE 216663659
04 Pedro Matos FALSE 232673541

Por defeito dados do tipo numérico (com excepção da descrição das linhas) são lidos como
variáveis numéricas e variáveis não numéricas, tal como ”Nome” são lidas como variáveis
do tipo caracter. Podemos assim utilizar directamente a função read.table() para ler estes
dados da forma

> ListaT el <− read.table(”ListaT elef onica.dat”)

Muitas vezes omitimos a descrição das linhas, e, o ficheiro ”ListaTelefonica.dat” poderá


aparecer sem a primeira coluna com a descrição das linhas de dados

Nome Apelido Casado Telefone


Jose Dias TRUE 212233449
Carla Sousa FALSE 224478442
Rosa Pereira TRUE 216663659
Pedro Matos FALSE 232673541

Neste caso podemos e devemos utilizar o comando

> ListaT el <− read.table(”ListaT elef onica.dat”, header = T RU E)

onde a opção header = T RU E especifica que a primeira linha é a linha de cabeçalho


com a descrição das variáveis. Repare-se que, no primeiro ficheiro de exemplo, o R inter-
pretou a primeira linha como cabeçalho devido à configuração do ficheiro, uma vez que a
primeira linha tinha menos um elemento que as restantes. Por vezes os ficheiros de dados
apenas contêm os dados sem qualquer descrição de linhas ou do nome das variáveis, neste
caso o R faz uma atribuição por defeito. Suponhamos agora que o nosso ficheiro está na
forma

Jose Dias TRUE 212233449


Carla Sousa FALSE 224478442
Rosa Pereira TRUE 216663659
Pedro Matos FALSE 232673541

pelo que podemos utilizar o comando

> ListaT el <− read.table(”ListaT elef onica.dat”)


> ListaT el

17
V1 V2 V3 V4
1 Jose Dias TRUE 212233449
2 Carla Sousa FALSE 224478442
3 Rosa Pereira TRUE 216663659
4 Pedro Matos FALSE 232673541
para atribuir os dados ao objecto ListaT el, ficando a i-ésima linha descrita por i e a
j-ésima variável com o nome V j.
...

11 Distribuições de Probabilidade
Uma utilidade importante do R é poder obter um conjunto de tabelas estatı́sticas. São
fornecidas, para cada distribuição de probabilidade, ferramentas que permitem calcular
a distribuição (cumulativa) P (X ≤ x), a função densidade de probabilidade, a função
quantil (dado q, permitem obter o menor valor de x tal que P (X ≤ x) > q) e obter
um conjunto de observações pseudo-distribuı́das. A seguinte tabela fornece uma lista dos
nomes utilizados para cada distribuição de probabilidade

Distribuição nome em R argumentos adicionais


Beta beta shape1, shape2, ncp
Binomial binom size, prob
Binomial negativa nbinom size, prob
Cauchy cauchy location, scale
Chi-quadrado chisq df, ncp
Exponential exp rate
F f df1, df2, ncp
Gamma gamma shape, scale
Geométrica geom prob
Hipergeométrica hyper m, n, k
Log-normal lnorm meanlog, sdlog
Logı́stica logis location, scale
Normal norm mean, sd
Poisson pois lambda
t Student t df, ncp
Uniforme unif min, max
Weibull weibull shape, scale
Wilcoxon wilcox m, n

Temos de utilizar o prefixo ”d” para a função densidade de probabilidade (função de pro-
babilidade), ”p” para a função (cumulativa) de distribuição, ”q” para a função quantil e
”r” para simulação de valores pseudo-distribuı́dos. O primeiro argumento para as funções
dxxx é x, q para pxxx, p para qxxx e n para as rxxx (excepto para rhyper e rwilcox, para
as quais é nn). O parâmetro de não centralidade, ncp, pode não estar ainda disponı́vel
para todos os casos: ver na ajuda on-line os detalhes. Todas as funções pxxx e qxxx têm
argumentos booleanos, lower.tail e log.p, e as funções dxxx têm o argumento booleano log.
Estes argumentos permitem, por exemplo, obter a função cumulativa (ou integrada) de

18
hazard H(t) = −log(1 − F (t)), da seguinte forma pxxx(t, ..., lower.tail = FALSE, log.p =
TRUE) ou mais concretamente a função log-likelihoods (logaritmo da função de verosimi-
lhança) utilizando directamente dxxx(..., log = TRUE). Vejamos agora alguns exemplos
de utilização destas funções.

> pnorm(0, 0, 1)
[1] 0.5

> pnorm(0)
[1] 0.5

Em algumas destas funções podemos omitir argumentos, uma vez que, por defeito eles
estão definidos. No caso da normal, o valor médio e desvio padrão são, por defeito, 0 e 1
respectivamente. Iremos ver, mais à frente, como se definem funções com parâmetros que
podem ser omitidos na utilização destas.

> dbinom(0, 1, 0.2)


[1] 0.8

dá a probabilidade duma variável aleatória, com distribuição binomial de parâmetros 1 e


0.2, tomar o valor 0.

> rbinom(10, 1, 0.2)


[1] 0 0 1 0 0 1 0 0 0 0

gera 10 números pseudo-distribuı́dos para a distribuição binomial com parâmetros 1 e


0.2. O seguinte exemplo demonstra que o R é uma ferramenta muito versátil

> x <− c(0, 1, 2)


> pbinom(x, 2, 0.5)
[1] 0.25 0.75 1.00

obtendo-se um vector com os valores da função distribuição para todas as componen-


tes do vector x. Podemos fazer o mesmo mas para os parâmetros

> prob <− c(0.1, 0.5, 0.9)


> pbinom(0, 2, prob)
[1] 0.81 0.25 0.01

obtendo-se um vector com os valores da função de distribuição no ponto 0 para o conjunto


de parâmetros (2, 0.1), (2, 0.5) e (2, 0.9).

> qt(0.05, 2, lower.tail = F ALSE)


[1] 2.919986

valor com probabilidade cumulativa (superior), igual a 0.05 para a distribuição t-Student
com 2 graus de liberdade.

19
12 Representações gráficas
...

20

Você também pode gostar