Como já discutido na aula motivacional para o curso, R é uma linguagem e ambiente para computação estatística e gráfica, disponível sob os termos da licença GNU de software livre. Criada em 1996 por Robert Gentleman and Ross Ihaka, o R pode ser considerado um diferente implementação de S, a linguagem comercial desenvolvida pela Bell Laboratories, que antecede o R.
Pode-se destacar diversos tópicos que fazem do R a excelência em software para manipulação de dados, análise estatística e visualização gráfica, porém listamos apenas alguns abaixo:
Explore o sítio do projeto R e o espelho c3sl UFPR da rede global de arquivos R.
Outros sites interessantes sobre iniciativas com o R são:
O ambiente de desenvilvimento integrado - IDE (Intergrated DEvelopment Environment) RStudio é um produto da empresa RStudio (https://www.rstudio.com/) que, como o próprio nome diz, é um ambiente de desenvolvimento integrado de códigos R. O RStudio IDE permite o desenvolvimento de códigos de outras linguagens também, porém diversas funcionalidade são otimizadas para R.
O download do RStudio IDE pode ser feito pelo endereço https://www.rstudio.com/products/rstudio/download/ com versões disponíveis para diversas plataformas (Linux, Windows e MAC).
No curso utilizaremos essencialmente o RStudio por facilidade, mas existem outros editores e o usuário de R tem a liberdade para escolher o que mais lhe agrada. Para a escolha de um editor destacamos algumas ferramentas que são indispensáveis para um bom desenvolvimento de programação R:
Ao instalar o RStudio, temos a interface do programa com a seguinte estrutura descrita abaixo:
em que:
Crtl+R
, ou atalho da interface.
Aqui foram listados, brevemente, alguns aspectos da interface, todavia seja curioso e explore as demais funcionalidades do RStudio IDE.
Toda a edição de scripts realizada no RStudio IDE pode ser otimizada utilizando atalhos do teclado para algumas rotinas. Quanto menos você precisar do mouse mais rápida e eficientemente você programa.
Todos os atalhos do RStudio podem ser visualizados no menu de navegação (A)->Tools->Keyboard Shortcuts Help
, ou ainda pelo atalho Alt+Shift+K
. Os atalhos indispensáveis são:
Alt+-
: Sinal de atribuir (<-
);Ctrl+r
: Executar linha/região do script;Ctrl+i
: Indentar região; eCtrl+Shift+C
: Comentar linha/região.O R pode ser usado como calculadora, todas as operações matemáticas básicas estão disponíveis em R.
2 + 2 # Soma
## [1] 4
4 - 2 # Subtração
## [1] 2
12 * 42 # Multiplicação
## [1] 504
54 / 30 # Divisão
## [1] 1.8
5^3 # Potência
## [1] 125
5**3 # Potência
## [1] 125
E claro, expressões numéricas também podem ser feitas. Respeita-se a hierárquia matemática primeiro potência < multiplicação < soma, porém essa ordenação pode ser contralada por parênteses.
2 + 2 * 4 + 4/2 # Hierarquia matemática
## [1] 12
2 + 2 * (4 + 4)/2 # Primeiro a soma dos 4's
## [1] 10
(2 + 2) * 4 + 4/2 # Primeiro a soma dos 2's
## [1] 18
(2 + 2) * (4 + 4)/2 # Primeiro as somas
## [1] 16
((2 + 2) * (4 + 4)/2)/2 # Vários parenteses
## [1] 8
Operações matematicamente incorretas ou não exatas também tem seu valor representado em R.
0/0 # Impossível, não existe (Not a Number - NaN)
## [1] NaN
1/0 # Indefinido, positivo de infinito (Inf)
## [1] Inf
-1/0 # Indefinido, negativo de infinito (-Inf)
## [1] -Inf
NA # Valor não disponível (Not Available - NA)
## [1] NA
As operações descritas acima são operações matemáticas simples, porém em muitas situações deseja-se realizar testes lógicos, e.g. o peso do paciente é maior de 60Kg, abaixo exemplificamos como realizar esses testes.
2 == 4 # Igualdade
## [1] FALSE
2 > 4 # Desigualdade (maior)
## [1] FALSE
2 < 4 # Desigualdade (menor)
## [1] TRUE
2 >= 4 # Desigualdade (maior igual)
## [1] FALSE
2 <= 4 # Desigualdade (menor igual)
## [1] TRUE
E claro expressões lógicas também podem ser realizadas.
(2 + 2) >= 4
## [1] TRUE
(2 + 2)/2 < 4
## [1] TRUE
Outro operador lógico muito útil é o de negação !
, esse operador inverte um resultado lógico
!2 == 4
## [1] TRUE
!2 > 4
## [1] TRUE
!2 < 4
## [1] FALSE
O R é uma linguagem orientada a objetos, ou seja, objetos (valores, vetores, matrizes, listas, funções, etc.) são armazenadas em espaços de memória de seu computador, para posteriormente serem utilizados. Atribui-se algo a um objeto pelo operador <-
.
x <- 2 # Atribuindo o valor 2 ao objeto x
y <- 4 # Atribuindo o valor 2 ao objeto y
x + y
## [1] 6
z <- x * y # Atribuindo ao z o valor da multiplicação de x por y
z
## [1] 8
a <- 2 == 2 # Valores lógicos também podem ser armazenados em objetos
a
## [1] TRUE
Isso mesmo, em R a atribuição é realizada de forma muito simples!
O R tem uma gama muito grande de classes de objetos. Todo objeto possui uma classe que o define. Usuários de R devem conhecer bem as classes de seus objetos para coordenar funções apropriadas a eles.
Use e abuse das funções class()
, que exibe a classe do objeto e str()
, que mostra sua estrutura.
# Verificando a estrutura dos objetos criados
str(x)
## num 2
class(x)
## [1] "numeric"
str(a)
## logi TRUE
class(a)
## [1] "logical"
# Classes comuns no R
"string"; class("string") # character
## [1] "string"
## [1] "character"
100L; class(100L) # integer
## [1] 100
## [1] "integer"
100; class(100) # numeric
## [1] 100
## [1] "numeric"
TRUE; class(TRUE) # logical
## [1] TRUE
## [1] "logical"
O R é uma linguagem vetorial, ou seja, operações com objetos dessa classe são realizadas diretamento, sem a necessidade de loops (for
, por exemplo).
A criação de vetores é feita, em geral, com a função c()
de combinar valores em vetores ou listas.
x <- c(2, 4, 6, 8, 10, 12)
x
## [1] 2 4 6 8 10 12
# O que é x?
str(x)
## num [1:6] 2 4 6 8 10 12
class(x)
## [1] "numeric"
Vetores também podem ser criados com as funções rep()
e seq()
, que fazem repetições e sequências respectivamente e com o operador :
que faz a sequência de incremento 1 entre dois valores.
y <- 1:6
y
## [1] 1 2 3 4 5 6
E claro, as operações com os vetores.
x * 2
## [1] 4 8 12 16 20 24
x / y
## [1] 2 2 2 2 2 2
As operações lógicas seguem da mesma forma, todavia podemos introduzir um novo operador o %in%
, esse é o operador “pertence”.
x == y # x é igual a y, elemento a elemento?
## [1] FALSE FALSE FALSE FALSE FALSE FALSE
2 %in% y # 2 pertence ao conjunto de y?
## [1] TRUE
x %in% y # x pertence ao conjunto y, elemento a elemento?
## [1] TRUE TRUE TRUE FALSE FALSE FALSE
E a seleção de valores do vetor é feita com os operadores []
.
y[1] # Seleciona o 1º elemento
## [1] 1
y[c(1, 3)] # Seleciona o 1º e quinto elementos
## [1] 1 3
y[y > 3] # Seleciona apenas os y que são maiores que 3
## [1] 4 5 6
y[x %in% y] # Seleciona apenas os y que satizfazem x %in% y
## [1] 1 2 3
Matrizes representam um conjunto de valores organizados em linhas e colunas. Matrizes são criadas com a função matrix()
, onde informamos os valores que faram parte da matriz e a dimensão dessa matriz, os argumentos da função são (não se preocupe com todos os argumentos, alguns tem um valor padrão! Discutiremos funções adiante).
# Argumentos da função matrix
# help(matrix)
args("matrix")
## function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
## NULL
Agora criando matrizes
# Matrizes com 10 elementos de dimensão 2x5
matrix(data = 1:10, nrow = 2, ncol = 5)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 3 5 7 9
## [2,] 2 4 6 8 10
matrix(data = 1:10, nrow = 2, ncol = 5, byrow = TRUE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 2 3 4 5
## [2,] 6 7 8 9 10
# Matrizes com 18 elementos de dimensão 3x6
matrix(data = 1:18, nrow = 3)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 4 7 10 13 16
## [2,] 2 5 8 11 14 17
## [3,] 3 6 9 12 15 18
matrix(data = 1:18, nrow = 3, byrow = TRUE)
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 7 8 9 10 11 12
## [3,] 13 14 15 16 17 18
A seleção de elementos da matriz também é feita com o operador []
, porém agora temos duas dimensões para seleção, as linhas e as colunas.
# Matrizes com 18 elementos de dimensão 3x6
ma <- matrix(data = 1:18, nrow = 3, byrow = TRUE)
ma
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 7 8 9 10 11 12
## [3,] 13 14 15 16 17 18
# Estrutura do objeto
str(ma)
## int [1:3, 1:6] 1 7 13 2 8 14 3 9 15 4 ...
ma[1, 3] # Elemento da linha 1 e coluna 3
## [1] 3
ma[, 3] # Elementos da coluna 3 (é um vetor)
## [1] 3 9 15
ma[1, ] # Elementos da linha 1 (é um vetor)
## [1] 1 2 3 4 5 6
O foco deste curso não será na computação. Portanto não apresentaremos as operações com matrizes mas saiba que existem, adição e multiplicação de matrizes, transposta, inversa, produto interno, traço, entre outras operações podem facilmente realizadas com funções nativas do R.
data.frames
são a classe de objetos que mais utilizamos. Eles são a representação dos nossos dados em R. Podemos criar data.frames
com a função data.frame
. Assim como nas matrizes, veja seus argumentos e consulte o help da função.
# Argumentos da função data.frame
# help(data.frame)
args("data.frame")
## function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,
## fix.empty.names = TRUE, stringsAsFactors = default.stringsAsFactors())
## NULL
# Um exemplo de data.frame
data.frame(x = 1:6, y = 11:16, z = rep(0:1, 3))
## x y z
## 1 1 11 0
## 2 2 12 1
## 3 3 13 0
## 4 4 14 1
## 5 5 15 0
## 6 6 16 1
# Construindo data.frames com objetos criados
data.frame(x = x, y = y, z = x * y, w = x %in% y)
## x y z w
## 1 2 1 2 TRUE
## 2 4 2 8 TRUE
## 3 6 3 18 TRUE
## 4 8 4 32 FALSE
## 5 10 5 50 FALSE
## 6 12 6 72 FALSE
Agora que já sabemos como criar data.frames
, criaremos um data.frame
fictício para exemplificar a seleção de elementos de um objeto dessa classe, que pode realizada com os operadores $
ou ainda []
.
# Criando dados fictícios de pacientes
da <- data.frame(
nome = c("João", "Maria", "José", "Pedro", "Ana", "Carla", "Paulo"),
idade = c(30, 22, 21, 40, 32, 18, 24),
sexo = c("M", "F", "M", "M", "F", "F", "M"),
imc = c(30.98, 37, 42.29, 27.59, 21.18, 25.23, 8.81),
hdl = c(68.89, 70.25, 15.59, 49.24, 50.79, 45.22, 56.65)
)
da
## nome idade sexo imc hdl
## 1 João 30 M 30.98 68.89
## 2 Maria 22 F 37.00 70.25
## 3 José 21 M 42.29 15.59
## 4 Pedro 40 M 27.59 49.24
## 5 Ana 32 F 21.18 50.79
## 6 Carla 18 F 25.23 45.22
## 7 Paulo 24 M 8.81 56.65
# Estrutura dos dados
str(da)
## 'data.frame': 7 obs. of 5 variables:
## $ nome : Factor w/ 7 levels "Ana","Carla",..: 3 5 4 7 1 2 6
## $ idade: num 30 22 21 40 32 18 24
## $ sexo : Factor w/ 2 levels "F","M": 2 1 2 2 1 1 2
## $ imc : num 31 37 42.3 27.6 21.2 ...
## $ hdl : num 68.9 70.2 15.6 49.2 50.8 ...
da[2, ] # Selecionando os dados da Maria
## nome idade sexo imc hdl
## 2 Maria 22 F 37 70.25
da[, 2] # Selecionando as idades
## [1] 30 22 21 40 32 18 24
da[, "idade"] # Selecionando as idades
## [1] 30 22 21 40 32 18 24
da$idade # Selecionando as idades
## [1] 30 22 21 40 32 18 24
da[, c("imc", "hdl")] # Selecionando as variáveis imc e hdl
## imc hdl
## 1 30.98 68.89
## 2 37.00 70.25
## 3 42.29 15.59
## 4 27.59 49.24
## 5 21.18 50.79
## 6 25.23 45.22
## 7 8.81 56.65
da[2, c("imc", "hdl")] # Selecionando as variáveis imc e hdl da Maria
## imc hdl
## 2 37 70.25
Note que a seleção de elementos é bastante similar a seleção no caso das matrizes. A principal diferença entre matrizes e data.frames
no R é que data.frames
permitem que cada coluna possua um vetores com elementos de classes diferentes (fatores, numéricos, inteiros, caracteres, lógicos, etc.), isso não é possível em matrizes.
As listas são os objetos mais flexíveis em R, elas permitem armazenar diversos formatos em um único objeto. Listas são criadas com a função list()
.
# Lista de vetores
list(a = 1:6, b = c("Olá", "mundo"), c = c(TRUE, FALSE, FALSE))
## $a
## [1] 1 2 3 4 5 6
##
## $b
## [1] "Olá" "mundo"
##
## $c
## [1] TRUE FALSE FALSE
# Lista com objetos de diferentes tipos
la <- list(ma = ma, da = da, x = x, y = y)
la
## $ma
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 7 8 9 10 11 12
## [3,] 13 14 15 16 17 18
##
## $da
## nome idade sexo imc hdl
## 1 João 30 M 30.98 68.89
## 2 Maria 22 F 37.00 70.25
## 3 José 21 M 42.29 15.59
## 4 Pedro 40 M 27.59 49.24
## 5 Ana 32 F 21.18 50.79
## 6 Carla 18 F 25.23 45.22
## 7 Paulo 24 M 8.81 56.65
##
## $x
## [1] 2 4 6 8 10 12
##
## $y
## [1] 1 2 3 4 5 6
# Estrutura da lista
str(la)
## List of 4
## $ ma: int [1:3, 1:6] 1 7 13 2 8 14 3 9 15 4 ...
## $ da:'data.frame': 7 obs. of 5 variables:
## ..$ nome : Factor w/ 7 levels "Ana","Carla",..: 3 5 4 7 1 2 6
## ..$ idade: num [1:7] 30 22 21 40 32 18 24
## ..$ sexo : Factor w/ 2 levels "F","M": 2 1 2 2 1 1 2
## ..$ imc : num [1:7] 31 37 42.3 27.6 21.2 ...
## ..$ hdl : num [1:7] 68.9 70.2 15.6 49.2 50.8 ...
## $ x : num [1:6] 2 4 6 8 10 12
## $ y : int [1:6] 1 2 3 4 5 6
Note que la
é uma lista com 4 elementos, para selecionarmos elementos dessa lista usamos o operador [[]]
.
la[[1]] # Primeiro elemento da lista
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 2 3 4 5 6
## [2,] 7 8 9 10 11 12
## [3,] 13 14 15 16 17 18
la[["da"]] # Elemento 'da' da lista
## nome idade sexo imc hdl
## 1 João 30 M 30.98 68.89
## 2 Maria 22 F 37.00 70.25
## 3 José 21 M 42.29 15.59
## 4 Pedro 40 M 27.59 49.24
## 5 Ana 32 F 21.18 50.79
## 6 Carla 18 F 25.23 45.22
## 7 Paulo 24 M 8.81 56.65
la[c("x", "y")] # Sub-lista com x e y
## $x
## [1] 2 4 6 8 10 12
##
## $y
## [1] 1 2 3 4 5 6
# Agora para selecionar as idades do elemento 'da' da lista 'la'
la[["da"]][, "idade"]
## [1] 30 22 21 40 32 18 24
# E a segunda linha do elemento 'ma' da lista 'la'
la[["ma"]][2, ]
## [1] 7 8 9 10 11 12
Uma das grandes vantagens em linguagens de programação é que podemos criar nossas próprias funções e com isso controladas toda a rotina de análise. Em R não pe diferente, podemos criar nossas próprias função, bem como utilizar as que já existem, como fizemos até agora.
Funções em R são construídas com a estrutura de programação function
. Abaixo exemplificamos como se cria uma função em R.
# Função que soma 2 ao elemento
fx <- function(a) {
(a + 2)
}
# O que é fx?
class(fx)
## [1] "function"
# Usando a minha função
fx(2)
## [1] 4
fx(5)
## [1] 7
# fx("a") Erro
# Função com mais de um argumento
fx2 <- function(a, b) {
a + b
}
fx2(5, 4)
## [1] 9
fx2(3, 2)
## [1] 5
# fx2(3) Erro
# Função com argumento padrão (default)
fx2 <- function(a, b = 2) {
a + b
}
fx2(5)
## [1] 7
fx2(6)
## [1] 8
fx2(6, 5)
## [1] 11
E é dessa forma que são construídas as funções em R. Eventualmente precisamos escrever nossas função, porém para análises simples todas as funções já existem no R. Para utilizá-las utilize a sintaxe funcao(argumentos)
e não dispense ler sua documentação help("funcao")
.
Abaixo mostramos algumas funções para cálculo de estatísticas básicas para o conjunto de dados fictício da
.
mean(da$hdl) # média de hdl
## [1] 50.94714
median(da$hdl) # mediana de hdl
## [1] 50.79
var(da$hdl) # variância
## [1] 335.4893
sd(da$hdl) # desvio padrão
## [1] 18.31637
min(da$hdl) # valor mínimo
## [1] 15.59
max(da$hdl) # valor máximo
## [1] 70.25
quantile(da$hdl) # Quantis
## 0% 25% 50% 75% 100%
## 15.59 47.23 50.79 62.77 70.25
O R possui uma comunidade muito ativa de desenvolvedores e com sua facilidade de programação diversos pacotes de função são disponibilizados aos usuários diariamente. O principal repositório de disponibilização de pacotes é o CRAN e é por lá que fazemos a instalação de pacotes adicionais.
Não se preocupe em ir pro site, baixar arquivo e depois instalar. A comunidade R já resolveu isso, para instalação de pacotes do CRAN basta utilizar a função install.packages()
.
# help(install.packages)
# Instalando o pacote rmarkdown, que utilizaremos ao final do curso
install.packages("rmarkdown")
Como vimos na seção Data Frames, nosso dados são representados em R como data.frames
e podemos digitar cada dado de nossa eventual planilha para o R, como fizemos com o exemplo da
. Todavia isso acaba se tornando inviável rapidamente, e surge a necessidade de entrar com dados no R via arquivos externos, é disso que tratamos na próxima seção.
O local mais comum para armazenamento de conjuntos de dados não tão grandes, é em planilhas eletrônicas (LibreOffice Calc, Excel, etc.), esses arquivos tem extensão xlsx
, xls
, odt
entre outras, esses arquivos são arquivos binários, que são interpretador por um programa e exibem uma interface para edição. A leitura de arquivos binários em R é possível, porém recomendamos que para leitura o usuário exporte os dados de sua planilha para um formato de texto pleno (.csv
, .tsv
, txt
).
Para leitura de dados em texto pleno utiliza-se a função read.table
.
# head(read.table)
args(read.table)
## function (file, header = FALSE, sep = "", quote = "\"'", dec = ".",
## numerals = c("allow.loss", "warn.loss", "no.loss"), row.names,
## col.names, as.is = !stringsAsFactors, na.strings = "NA",
## colClasses = NA, nrows = -1, skip = 0, check.names = TRUE,
## fill = !blank.lines.skip, strip.white = FALSE, blank.lines.skip = TRUE,
## comment.char = "#", allowEscapes = FALSE, flush = FALSE,
## stringsAsFactors = default.stringsAsFactors(), fileEncoding = "",
## encoding = "unknown", text, skipNul = FALSE)
## NULL
Antes de utilizar essa função verifique como o arquivo está disposto, faça isso visualizando seu arquivo em um editor de texto, pode ser até no RStudio. Feito isso identifique
header = TRUE
;sep = "\t"
;sep = ";"
;sep = ","
;sep = "outro caracter"
dec = "."
dec = ","
quote = ""
Estes são os principais argumentos da função, caso a leitura for incorreta procure identiicar o erro visualizando o arquivo e investigando os demais argumentos. Faremos o exercício de leitura de dados com o exemplo real de dados de médicos residentes por município, os dados estão disponíveis para download em medicos.csv.
# Lendo os dados sobre médicos residentes
# Baixado do sítio <http://www.ipeadata.gov.br/>
# Baixe em <stats-cwr.github.io/stats4med/data/medicos.csv>
# Primeiro veja como o arquivo está disposto (abra o csv em um bloco de
# notas ou no RStudio). Aqui veremos sua estutura com a função readLines
head(readLines("./data/medicos.csv"), 10)
## [1] "Médicos residentes (por mil habitantes)"
## [2] "Sigla;Código;Município;1991;2000;"
## [3] "AC;1200013;Acrelândia;0;0;"
## [4] "AC;1200054;Assis Brasil;0;0;"
## [5] "AC;1200104;Brasiléia;0;0,506;"
## [6] "AC;1200138;Bujari;0;0;"
## [7] "AC;1200179;Capixaba;0;0;"
## [8] "AC;1200203;Cruzeiro do Sul;0,156;0,528;"
## [9] "AC;1200252;Epitaciolândia;0;0;"
## [10] "AC;1200302;Feijó;0;0;"
Note que a primeira linha tem apenas um título para o arquivo e não pertence ao conjunto de dados, portanto devemos pular a 1º linha. Na segunda linha temos um cabeçalho que representa as caracteriticas que foram observadas em cada município. Os dados estão separados por ponto e vírgula ;
. O separador decimal é do padrão brasileiro com vírgula ,
. E temos nomes de cidades que utilizam apóstofro '
. Com base nessas informações a leitura dos dados será
# Lendo os dados
dados <- read.table(
"./data/medicos.csv", # o caminho para o .csv
header = TRUE, # tem cabeçalho
sep = ";", # Separador ;
dec = ",", # Decimais com ,
quote = "", # Nada define caracteres no .csv
skip = 1, # Pula a primeira linha
encoding = "UTF-8" # Codificação de caracteres uft-8
)
# Verificando se a leitura foi correta
str(dados)
## 'data.frame': 5596 obs. of 6 variables:
## $ Sigla : Factor w/ 27 levels "AC","AL","AM",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ Código : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ Município: Factor w/ 5315 levels "Abadia de Goiás",..: 27 396 709 751 1022 1414 1603 1678 2499 2769 ...
## $ X1991 : num 0 0 0 0 0 0.156 0 0 0 0 ...
## $ X2000 : num 0 0 0.506 0 0 0.528 0 0 0 0 ...
## $ X : logi NA NA NA NA NA NA ...
# Podemos excluir a última coluna, pois essa só foi adicionada porque as
# linhas terminam em ;
dados <- dados[, -6]
# Podemos renomear as colunas para facilitar a manipulação
colnames(dados) <- c("estado", "codigo", "municipio", "med1", "med2")
# Verificando novamente a estrutura
str(dados)
## 'data.frame': 5596 obs. of 5 variables:
## $ estado : Factor w/ 27 levels "AC","AL","AM",..: 1 1 1 1 1 1 1 1 1 1 ...
## $ codigo : int 1200013 1200054 1200104 1200138 1200179 1200203 1200252 1200302 1200328 1200336 ...
## $ municipio: Factor w/ 5315 levels "Abadia de Goiás",..: 27 396 709 751 1022 1414 1603 1678 2499 2769 ...
## $ med1 : num 0 0 0 0 0 0.156 0 0 0 0 ...
## $ med2 : num 0 0 0.506 0 0 0.528 0 0 0 0 ...
E assim temos o conjunto de dados medicos.csv
devidamente disponível no R.
Para dados de texto pleno a principal função é a read.table
, todavia podemos procurar por outras funções de leitura.
# Funções que contém 'read' no nome
apropos("read")
## [1] ".readRDS" "read_chunk" "read_demo"
## [4] "read_rforge" "read.csv" "read.csv2"
## [7] "read.dcf" "read.delim" "read.delim2"
## [10] "read.DIF" "read.fortran" "read.ftable"
## [13] "read.fwf" "read.socket" "read.table"
## [16] "readBin" "readChar" "readCitationFile"
## [19] "readline" "readLines" "readRDS"
## [22] "readRenviron" "Sys.readlink"
Agora que já sabemos ler corretamente um conjunto de dados, selecionar diversos objetos e coordenar funções no R, podemos juntar todo esse conhecimento para extrair estatísticas simples da base de dados que acabamos de ler.
# Resumo dos dados
summary(dados)
## estado codigo municipio med1
## MG : 853 Min. :1100015 Bom Jesus : 5 Min. :0.0000
## SP : 646 1st Qu.:2512175 Bonito : 4 1st Qu.:0.0000
## RS : 499 Median :3146280 Planalto : 4 Median :0.0000
## BA : 421 Mean :3253647 Santa Helena: 4 Mean :0.2317
## PR : 403 3rd Qu.:4119264 Santa Inês : 4 3rd Qu.:0.2845
## SC : 296 Max. :5300108 Santa Luzia : 4 Max. :6.8710
## (Other):2478 (Other) :5571 NA's :89
## med2
## Min. :0.0000
## 1st Qu.:0.0000
## Median :0.0000
## Mean :0.2708
## 3rd Qu.:0.4210
## Max. :7.2730
## NA's :89
Em R existe uma família de função que usufruem da vantagem do R ser uma linguagem vetorial, as funções apply
. Essas funções aplicam alguma função a um conjunto predefinido em algum objeto, e.g. calcular a média de idade das mulheres no conjunto de dados fictícios da
.
São diversas as funções da família apply
, abaixo temos uma lista mais que completa.
# Funções que terminam em apply
apropos("apply$")
## [1] ".mapply" "apply" "dendrapply" "eapply"
## [5] "grid.DLapply" "kernapply" "lapply" "mapply"
## [9] "rapply" "sapply" "tapply" "vapply"
Aqui utilizaremos somente as funções:
apply()
: opera em matrizes e data.frames.lapply()
: opera em vetores e listas (data.frame também é uma lista).sapply()
: idem à lapply
mas simplifica quando possível.tapply()
: um vetor reposta em função de (combinação de) estratos.Para exemplificar a utilização dessas funções voltemos ao conjunto de dados dados
. Lembre-se que esse conjunto de dados contém NA's
, portanto deve-se retirá-los, faremos isso com argumentos das funções (o na.rm
), mas pode-se retirar da base com na.omit
ou na.exclude
.
# Escolhe as variáveis de interesse
vars <- c("med1", "med2")
# Médias de idade, imc e hdl
apply(X = dados[, vars], MARGIN = 2, FUN = mean, na.rm = TRUE)
## med1 med2
## 0.2316806 0.2707808
# Mínino, 1 quartil, mediana, média, 3º quartil e máximo
apply(X = dados[, vars], MARGIN = 2, FUN = summary)
## med1 med2
## Min. 0.0000 0.0000
## 1st Qu. 0.0000 0.0000
## Median 0.0000 0.0000
## Mean 0.2317 0.2708
## 3rd Qu. 0.2845 0.4210
## Max. 6.8710 7.2730
## NA's 89.0000 89.0000
# Mínino, 1 quartil, mediana, média, 3º quartil e máximo
lapply(X = dados[, vars], FUN = summary)
## $med1
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0000 0.0000 0.0000 0.2317 0.2845 6.8710 89
##
## $med2
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0000 0.0000 0.0000 0.2708 0.4210 7.2730 89
# Mínino, 1 quartil, mediana, média, 3º quartil e máximo
sapply(X = dados[, vars], FUN = summary)
## med1 med2
## Min. 0.0000 0.0000
## 1st Qu. 0.0000 0.0000
## Median 0.0000 0.0000
## Mean 0.2317 0.2708
## 3rd Qu. 0.2845 0.4210
## Max. 6.8710 7.2730
## NA's 89.0000 89.0000
#-------------------------------------------
# Agora médias estratificadas por sexo
tapply(X = dados[, "med1"], INDEX = dados[, "estado"],
FUN = mean, na.rm = TRUE)
## AC AL AM AP BA CE
## 0.02281818 0.11896040 0.08443548 0.05056250 0.11662651 0.07042935
## DF ES GO MA MG MS
## 2.11400000 0.37345455 0.25871901 0.07854839 0.25471161 0.40357143
## MT PA PB PE PI PR
## 0.25975397 0.10627972 0.09723767 0.10690811 0.06149321 0.25226817
## RJ RN RO RR RS SC
## 0.82318681 0.08851807 0.15250000 0.45266667 0.32635760 0.28199317
## SE SP TO
## 0.05116000 0.41297519 0.17179137
tapply(X = dados[, "med2"], INDEX = dados[, "estado"],
FUN = mean, na.rm = TRUE)
## AC AL AM AP BA CE
## 0.17754545 0.15764356 0.14282258 0.08300000 0.13450120 0.12117935
## DF ES GO MA MG MS
## 2.04500000 0.42779221 0.23546281 0.07273733 0.30981477 0.23202597
## MT PA PB PE PI PR
## 0.28926190 0.12518881 0.09879821 0.12165946 0.05747059 0.31465163
## RJ RN RO RR RS SC
## 0.84309890 0.12803012 0.21711538 0.16513333 0.40568308 0.33447440
## SE SP TO
## 0.13041333 0.48426977 0.24969784
# Lista de conjuntos de dados para exercício
ls("package:datasets")
## [1] "ability.cov" "airmiles"
## [3] "AirPassengers" "airquality"
## [5] "anscombe" "attenu"
## [7] "attitude" "austres"
## [9] "beaver1" "beaver2"
## [11] "BJsales" "BJsales.lead"
## [13] "BOD" "cars"
## [15] "ChickWeight" "chickwts"
## [17] "co2" "CO2"
## [19] "crimtab" "discoveries"
## [21] "DNase" "esoph"
## [23] "euro" "euro.cross"
## [25] "eurodist" "EuStockMarkets"
## [27] "faithful" "fdeaths"
## [29] "Formaldehyde" "freeny"
## [31] "freeny.x" "freeny.y"
## [33] "HairEyeColor" "Harman23.cor"
## [35] "Harman74.cor" "Indometh"
## [37] "infert" "InsectSprays"
## [39] "iris" "iris3"
## [41] "islands" "JohnsonJohnson"
## [43] "LakeHuron" "ldeaths"
## [45] "lh" "LifeCycleSavings"
## [47] "Loblolly" "longley"
## [49] "lynx" "mdeaths"
## [51] "morley" "mtcars"
## [53] "nhtemp" "Nile"
## [55] "nottem" "npk"
## [57] "occupationalStatus" "Orange"
## [59] "OrchardSprays" "PlantGrowth"
## [61] "precip" "presidents"
## [63] "pressure" "Puromycin"
## [65] "quakes" "randu"
## [67] "rivers" "rock"
## [69] "Seatbelts" "sleep"
## [71] "stack.loss" "stack.x"
## [73] "stackloss" "state.abb"
## [75] "state.area" "state.center"
## [77] "state.division" "state.name"
## [79] "state.region" "state.x77"
## [81] "sunspot.month" "sunspot.year"
## [83] "sunspots" "swiss"
## [85] "Theoph" "Titanic"
## [87] "ToothGrowth" "treering"
## [89] "trees" "UCBAdmissions"
## [91] "UKDriverDeaths" "UKgas"
## [93] "USAccDeaths" "USArrests"
## [95] "UScitiesD" "USJudgeRatings"
## [97] "USPersonalExpenditure" "uspop"
## [99] "VADeaths" "volcano"
## [101] "warpbreaks" "women"
## [103] "WorldPhones" "WWWusage"
# Para usá-los faça
data("dado")
help("dado")
# Procura todas as funções com "help"
apropos("help")
## [1] "help" "help.request" "help.search" "help.start"
# Ajudas genéricas
help.start()
help.search("survival")
# Ajudas expecíficas
help(mean)
example("mean")
# Procura no site do R
RSiteSearch("t.test")
## R version 3.3.1 (2016-06-21)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu precise (12.04.5 LTS)
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
## [5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
## [7] LC_PAPER=en_US.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] grid stats graphics grDevices utils datasets base
##
## other attached packages:
## [1] gridExtra_2.2.1 ggplot2_2.2.0 knitr_1.15.1
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.8 revealjs_0.7 assertthat_0.1 digest_0.6.10
## [5] rprojroot_1.1 plyr_1.8.4 gtable_0.2.0 backports_1.0.4
## [9] magrittr_1.5 evaluate_0.10 scales_0.4.1 highr_0.6
## [13] stringi_1.1.2 lazyeval_0.2.0 rmarkdown_1.2 labeling_0.3
## [17] tools_3.3.1 stringr_1.1.0 munsell_0.4.3 yaml_2.1.14
## [21] colorspace_1.3-1 htmltools_0.3.5 tibble_1.2 methods_3.3.1