R é uma linguagem de programação baseada em C++ com foco na manipulação, análise e visualização de dados. A linguagem foi criada em 1993 pelo departamento de Estatística da Universidade de Auckland, Nova Zelândia.
1 - Open source.
2 - Linguagem simples e de fácil compreensão.
3 - Possui uma grande comunidade usuária.
4 - Grande número de blogs, foruns e páginas dedicadas à linguagem R.
5 - Facilidade de encontrar sugestões para perguntas referentes às dificuldades de uso da linguagem.
6 - Múltiplos frames.
7 - Multiplos ambientes de execução.
8 - Visualização fácil.
Baixe e instale o R no endereço:https://cran.r-project.org/bin/windows/base/R-4.0.2-win.exe
Após ter inslalado o R, baixe e instale o Rstudio em https://rstudio.com/products/rstudio/download/
$\Rightarrow$ R notebook
$\Rightarrow$ R markdown
$\Rightarrow$ Shiny
$\Rightarrow$ Rstudio cloud
Apesar da comodidade do Rstudio, o usuário R pode usar outras ferramentas que operam com a linguagem R.
Jupyter notebook $\Rightarrow$ https://jupyter.org/
Anaconda $\Rightarrow$ www.anaconda.com
cocalc $\Rightarrow$ www.cocalc.com
# Soma
1 + 1
# Subtração
1-1
# Multiplicação
10*10
# Divisão
100/10
# Potência
10^2
# Raiz quadrada
sqrt(100)
# Resto da divisão
10%%3
# Exponencial
exp(0)
# Logaritimo natural
log(1)
# Logaritimo na base
logb(10, base = exp(1))
# Igual
3 == 10%%2
# Diferente
3 != 10%%2
# Maior que
3 > 2
# Menor que
3 < 2
# Maior ou igual
3 >= 3
# Menor ou igual
3 <= 2
# Está contido em
2 %in% 1:10
# E
2 < 3 & 3 > 2
# Ou
2 < 3 | 3 < 2
Imprime (mostra) um valor ou objeto indicado
print("Eu estudo na UFC")
[1] "Eu estudo na UFC"
Mostra um valor ou objeto indicado (se diferencia do print por retornar também objetos complexos como figuras e funções)
show(objeto)
a <- 11:20
b <- 1:10
show(plot(a, b, type = "line"))
Warning message in plot.xy(xy, type, ...): “gráfico do tipo 'line' vai ser truncado para o primeiro caractere”
NULL
Permite que o usuário printe um objeto em conjunto com um texto.
sprintf(fmt, )
use %i para números inteiros, %f para números racionais e %s para caracteres alfanuméricos
sprintf("Eu estudo na %s", "UFC")
sprintf("Eu tenho %i anos", 18)
sprintf("Um Kg de arroz custa R$ %f", 9.50)
nome = "João"
idade = 25
peso = 75.50
sprintf("%s tem %i anos e pesa %f Kg", nome, idade, peso)
Permite a contrução de um objeto interativo que necessita de uma resposta prévia
nome = readline("Qual o seu nome? ")
print(nome)
Qual o seu nome? helson [1] "helson"
# Criando uma ferramenta para medir o IMC
altura = readline("Digite a sua altura em metros: ")
peso <- readline("Digite o seu peso em Kg: ")
imc <- as.numeric(peso)/as.numeric(altura)^2
print(sprintf("O seu IMC é de %f", imc))
Digite a sua altura em metros: 1.75 Digite o seu peso em Kg: 69 [1] "O seu IMC é de 22.530612"
head(1:1000)
É possível trabalhar com cinco classes de dados em R, sendo:
characters: Referente aos caracteres alfanuméricos (letras, palavras, frases, etc);
integers: Referente aos números inteiros (sem separação decimal).OBS: Esta classe vem acompanhada da letra L (ex: 4L);
numerical: Números inteiros e racionais com ou sem separação decimal;
logical: Referentes a noções básicas do próprio R como TRUE e FALSE;
complexes: Corresponde aos números complexos com partes reais e imaginárias (ex: 1+ 4i)
# Use is.character() para verificar de um determinado objeto é um character
is.character("Meu nome")
# Use is.integer() para verificar de um determinado objeto é um integerer
is.integer(10L)
# Use is.numeric() para verificar de um determinado objeto é um numeric
is.numeric(10.5)
# Use is.logical() para verificar de um determinado objeto é um logical
is.logical(TRUE)
# Use is.complex() para verificar de um determinado objeto é um complex
is.complex(4i)
# Para transformar uma determinada classe em character, use a função as.character()
as.character(12)
# Para transformar uma determinada classe em numeric, use a função asnumeric()
as.numeric("12")
# Para transformar uma determinada classe em logical, use a função as.logical()
as.logical(0)
# Para transformar uma determinada classe em integer, use a função as.integer()
as.integer(12.750)
# Para transformar uma determinada classe em complex, use a função as.complex()
as.complex(50)
Homogêneo | Heterogêneo | |
---|---|---|
1d | Vetor atômico | Lista |
2d | Matriz | Data Frame |
nd | Array |
É a estrutura básica de dados em R. Nesta estrutura só é possível inserir informações com uma única dimensão. Indicamos que se trata de umvetor atômico quando usamos o seguimento c()
vetor <- c(1)
vetor
Para checar se um determinado objeto é um vetor atômico use a função is.atomic()
is.atomic(vetor)
vetor<-c(1:10)
is.atomic(vetor)
vetor <- c("A", "B", 1, 2)
is.atomic(vetor)
# Vetores também podem conter outros vetores
c(1, c(1:5, c(2:7)))
# Valores missings são escritos como NA e são conhecidos como vetores lógicos
is.logical(NA)
c(NA, NA, 2,3,5)
doble Possuem duas classes de informações do mesmo tipo (exemplo, números inteiros e racionais)
integer Possuem apenas valores inteiros
character possuem apenas caracteres
is.numeric(c(1:10))
is.double(c(1,2,2.5))
is.character(c("A", "B", "C"))
typeof(c(2, 5, "A"))
typeof(c(1:10))
Listas possuem apenas uma dimensão, mas se diferem dos vetores pelo fato de que podem incluir vários tipos, incluindo listas. Usamos a função list() para criar uma lista.
lista1 <- list(1:4, 2:5, c(1,2,7), "A", list(1:3))
lista1
is.list(lista1)
# Uma lista de lista é conhecida como uma lista recursiva
is.recursive(lista1)
# Use a função str para verificar os componentes (estrutura) da lista
str(lista1)
List of 5 $ : int [1:4] 1 2 3 4 $ : int [1:4] 2 3 4 5 $ : num [1:3] 1 2 7 $ : chr "A" $ :List of 1 ..$ : int [1:3] 1 2 3
Qualquer objeto pode ter um atributo adicional arbitrário. Para isso, utiliza-se a função attr
y <- 1:10
attr(y, "meu_atributo") <- "Isto é um vetor"
attr(y, "meu_atributo")
str(attributes(y))
List of 1 $ meu_atributo: chr "Isto é um vetor"
attributes(y[1])
NULL
x <- c(a = 1, b = 2, c = 3)
# Podemos adicionar nomes a x modificando o vetor existente
names(x) <- c("a","b", "c")
x
# Ou podemos adicionar nomes em x criando uma cópia modificada do vetor
x <- c(a = 1, b = 2, c = 3)
x <- setNames(x, c("a","b", "c"))
x
# Para visualizar o nome dos componentes do objeto usamos a função names()
names(x)
# Adicionando o parâmetro dim a um vetor nós formamos um array
# array(vetor, dim = c(nº de linhas, nº de coluna, repetições))
b <- array(1:12, dim = c(4, 3, 2))
print(b)
, , 1 [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12 , , 2 [,1] [,2] [,3] [1,] 1 5 9 [2,] 2 6 10 [3,] 3 7 11 [4,] 4 8 12
Uma matriz é um caso especial de um array. Assim como o array, a matriz possui duas dimensões - linhas e colunas - Porém, as operações com arrays podem ser diferentes das operações com matrizes
# Use a função matrix para criar uma matriz
# matrix(vetor, ncol = nº de colunas,nrows = nº de linhas
mat <- matrix(1:16, ncol = 4, nrow = 4)
mat
1 | 5 | 9 | 13 |
2 | 6 | 10 | 14 |
3 | 7 | 11 | 15 |
4 | 8 | 12 | 16 |
# Você pode transformar um array em matriz
as.matrix(b[,,1])
# e pode usar a mesma lógica para o inverso
1 | 5 | 9 |
2 | 6 | 10 |
3 | 7 | 11 |
4 | 8 | 12 |
rownames(mat) <- c("1a linha","2a linha","3a linha","4a linha")
mat
1a linha | 1 | 5 | 9 | 13 |
---|---|---|---|---|
2a linha | 2 | 6 | 10 | 14 |
3a linha | 3 | 7 | 11 | 15 |
4a linha | 4 | 8 | 12 | 16 |
colnames(mat) <- c("coluna1", "coluna2", "coluna3", "coluna4")
mat
coluna1 | coluna2 | coluna3 | coluna4 | |
---|---|---|---|---|
1a linha | 1 | 5 | 9 | 13 |
2a linha | 2 | 6 | 10 | 14 |
3a linha | 3 | 7 | 11 | 15 |
4a linha | 4 | 8 | 12 | 16 |
matriz1 <- matrix(1:9, nrow=3, ncol = 3)
matriz2 <- matrix(11:19, nrow=3, ncol = 3)
matriz1 + matriz2
12 | 18 | 24 |
14 | 20 | 26 |
16 | 22 | 28 |
matriz1 - matriz2
-10 | -10 | -10 |
-10 | -10 | -10 |
-10 | -10 | -10 |
matriz1 %*% matriz2
150 | 186 | 222 |
186 | 231 | 276 |
222 | 276 | 330 |
matriz1 * 3
3 | 12 | 21 |
6 | 15 | 24 |
9 | 18 | 27 |
t(matriz1)
1 | 2 | 3 |
4 | 5 | 6 |
7 | 8 | 9 |
solve(matrix(c(4,4,-2,2,6,2,2,8,4),3,3))
1.0 | -0.5 | 0.5 |
-4.0 | 2.5 | -3.0 |
2.5 | -1.5 | 2.0 |
det(matriz1)
Uma pesquisa levantou informações sobre a renda e o consumo de 50 famílias.
A renda das famílias é dada pelo comando sample(x = 1500, size = 50, replace = T)
O consumo das famílias é dada pelo comando sample(x = 1350, size = 50, replace = T)
Calcule a propensão marginal a consumir destas famílias utilizando o estimador de mínimos quadrados ordinários no R, fazendo uso apenas das operações com matrizes. OBS: Antes de digitar os comandos no R,utilize o comando set.seed(200) para fixar os valores da amostra.
set.seed(200)
x = matrix(sample(x = 1500, size = 50, replace = T), nrow = 50, ncol = 1)
y = matrix(sample(x = 1350, size = 50, replace = T), nrow = 50, ncol = 1)
beta = (solve(t(x)%*%x))%*%(t(x)%*%y)
beta
0.542836 |
Tecnicamente, um data frame é uma lista de vetores de tamanhos iguais. Assim como as matrizes e arrays, os data frames possuem duas dimensões (linhas e colunas).
df <- data.frame(x = 1:3, y = c("a", "b", "c"))
df
x | y |
---|---|
<int> | <fct> |
1 | a |
2 | b |
3 | c |
class(df)
str(df)
'data.frame': 3 obs. of 2 variables: $ x: int 1 2 3 $ y: Factor w/ 3 levels "a","b","c": 1 2 3
is.data.frame(df)
#### linhas abaixo de linhas => usar o rbind
df1 <- data.frame(x = 4:6, y = c("d", "e","f"))
rbind(df, df1)
x | y |
---|---|
<int> | <fct> |
1 | a |
2 | b |
3 | c |
4 | d |
5 | e |
6 | f |
#### colunas ao lado de colunas => usar o cbind
df1 <- data.frame(x1 = 4:6, y1 = c("d", "e","f"))
cbind(df, df1)
x | y | x1 | y1 |
---|---|---|---|
<int> | <fct> | <int> | <fct> |
1 | a | 4 | d |
2 | b | 5 | e |
3 | c | 6 | f |
df$v1 <- c(10:12)
df
x | y | v1 |
---|---|---|
<int> | <fct> | <int> |
1 | a | 10 |
2 | b | 11 |
3 | c | 12 |
df[,4] <- c(10:12)
df
x | y | v1 | V4 |
---|---|---|---|
<int> | <fct> | <int> | <int> |
1 | a | 10 | 10 |
2 | b | 11 | 11 |
3 | c | 12 | 12 |
df[4,] <- c(4, "d", 13, 13)
df
Warning message in `[<-.factor`(`*tmp*`, iseq, value = "d"): “invalid factor level, NA generated”
x | y | v1 | V4 | |
---|---|---|---|---|
<chr> | <fct> | <chr> | <chr> | |
1 | 1 | a | 10 | 10 |
2 | 2 | b | 11 | 11 |
3 | 3 | c | 12 | 12 |
4 | 4 | NA | 13 | 13 |
df[, -4]
x | y | v1 | |
---|---|---|---|
<chr> | <fct> | <chr> | |
1 | 1 | a | 10 |
2 | 2 | b | 11 |
3 | 3 | c | 12 |
4 | 4 | NA | 13 |
# deletando mais de uma coluna
df[, -c(3,4)]
x | y | |
---|---|---|
<chr> | <fct> | |
1 | 1 | a |
2 | 2 | b |
3 | 3 | c |
4 | 4 | NA |
df[-4,]
x | y | v1 | V4 | |
---|---|---|---|---|
<chr> | <fct> | <chr> | <chr> | |
1 | 1 | a | 10 | 10 |
2 | 2 | b | 11 | 11 |
3 | 3 | c | 12 | 12 |
# Deletando mais de uma linha
df[-c(3,4),]
x | y | v1 | V4 | |
---|---|---|---|---|
<chr> | <fct> | <chr> | <chr> | |
1 | 1 | a | 10 | 10 |
2 | 2 | b | 11 | 11 |
Quando dois dataframes possui uma coluna de ligação em comum, é possível uní-las utilizando a função merge()
dt1 <- data.frame(idade = c(18, 22, 50, 78, 25,27), experiencia = c(0, 1, 22, 40, 4, 4),
id = c("joão", "maria", "josé", "alice", "pedro", "antonio"), stringsAsFactors = FALSE)
dt2 <- data.frame(id = c("josé", "alice", "pedro", "joão", "maria", "antonio"),
renda = c(800, 1200, 2300, 1750, 900, 1100), stringsAsFactors = FALSE)
dt3 <- merge(dt1, dt2, by.x = "id", by.y = "id")
dt3
id | idade | experiencia | renda |
---|---|---|---|
<chr> | <dbl> | <dbl> | <dbl> |
alice | 78 | 40 | 1200 |
antonio | 27 | 4 | 1100 |
joão | 18 | 0 | 1750 |
josé | 50 | 22 | 800 |
maria | 22 | 1 | 900 |
pedro | 25 | 4 | 2300 |
# 1 - Crie um data frame unindo os três data frames abaixo sabendo que as variáveis COD_ID, ID e IDENT
# se referem ao código de identificação de cada observação
df1 <- data.frame(COD_ID = 1:4, peso = c(50.1, 50.5, 78.4, 90.0), idade = c(45, 26, 35, 60))
df2 <- data.frame(ID = c(1, 2, 4, 3), altura = c("1.60", "1.62", "1.74", "1.72"))
df3 <- data.frame(IDENT = c("4", "2", "1", "3"), sexo = c(T, T, F, T))
# 2 - Com o data frame resultante da questão anterior, adicione uma coluna de nome ano_nascimento contendo o ano
# que cada indivíduo nasceu, sabendo que essas informações foram coletadas em 2019.
# 3 - Crie uma coluna adicional no data frame indicando o índice de massa corporal (IMC) de cada indivíduo.
# 4 - Suponha que você está construindo um programa que vise minimizar os custos de uma ida ao supermercado.
# Suponha também que só existem três tipos de produtos (roupa, comida e bebida).
# Faça uma aplicação que pergunte o preço e a quantidade adquirida bde cada item e retorne o valor da compra.