Operações básicas
# Soma
1 + 1
## [1] 2
# Subtração
2 - 3
## [1] -1
# Multiplicação
2 * 3
## [1] 6
# Divisão
6 / 4
## [1] 1.5
Objetos básicos
Para criar um objeto, atribuímos algo (neste caso, um valor) a um nome por meio do operador de atribuição <- ou =:
obj1 <- 5
obj2 = 5 + 2
Note que ambos objetos foram criados e aparecem no quadrante superior/direito (Environment). Agora, podemos imprimir os seus valores executando o nome do objeto
obj1
## [1] 5
ou imprimindo explicitamente por meio da função print():
print(obj2)
## [1] 7
Note que, podemos alterar um objeto atribuindo algo novo a ele:
obj1 = 3
obj1
## [1] 3
É possível visualizar o tipo de objeto usando a função class():
class(obj1)
## [1] "numeric"
Logo, obj1 é um número real. Há 5 tipos de classes de objetos “atômicos” (que contêm apenas 1 valor):
character: textonumeric: número realinteger: número inteirocomplex: número complexological: verdadeiro/falso (1 ou 0)
num_inteiro = 3L # para número inteiro, usar sufixo L
num_inteiro
## [1] 3
class(num_inteiro)
## [1] "integer"
texto = "Oi"
texto
## [1] "Oi"
class(texto)
## [1] "character"
boolean1 = TRUE # ou = T
boolean1
## [1] TRUE
class(boolean1)
## [1] "logical"
boolean2 = FALSE # ou = T
boolean2
## [1] FALSE
class(boolean2)
## [1] "logical"
Expressões lógicas/booleanas
São expressões que retornam o valor Verdadeiro ou Falso:
2 < 20 # TRUE
## [1] TRUE
15 >= 19 # FALSE
## [1] FALSE
100 == 10^2 # TRUE
## [1] TRUE
100 != 20*5 # FALSE
## [1] FALSE
É possível escrever expressões compostas utilizando | (ou) e & (e):
x = 20 # atribuindo 20 a x
# Expressões lógicas compostas
x < 0 | x^2 > 100 # TRUE se UMA das expressões for TRUE
## [1] TRUE
x < 0 & x^2 > 100 # TRUE se TODAS expressões for TRUE
## [1] FALSE
Tabela de Precedência de Operadores
- Nível 6 - potenciação:
^- Nível 5 - multiplicação:
*,/- Nível 4 - adição:
+,-- Nível 3 - relacional:
==,!=,<=,>=,>,<- Nível 2 - lógico:
&(e)- Nível 1 - lógico:
|(ou)
- Níveis 4 a 6: são utilizados para CALCULAR valores
- Nível 3: é usado para relacionar 2 valores para CRIAR UMA expressão lógica
- Níveis 1 e 2: são usados para JUNTAR expressões lógicas
Vetores e Matrizes
- Depois das 5 classes de objetos apresentadas acima, as mais básicas são vetores e matrizes, que possuem mais de um elemento dentro do objeto.
- Ambos necessariamente exigem que os seus elementos sejam da mesma classe.
Vetores
- Data types - Vectors and lists (John Hopkins/Coursera)
- Podemos criar um vetor usando a função
c()e incluindo os valores separados por,:
x = c(0.5, 0.6) # numeric
x = c(TRUE, FALSE) # logical
x = c("a", "b", "c") # character
x = 9:12 # integer (é igual a c(9, 10, 11, 12))
Matrizes
Matrizes são vetores (e, portanto, possuem elementos de mesma classe) com atributo de dimensão (nº linhas por nº colunas). Uma matriz pode ser criada usando a função matrix():
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, ...)
data: an optional data vector (including a list or expression vector).
nrow: the desired number of rows.
ncol: the desired number of columns.
byrow: logical. If FALSE (the default) the matrix is filled by columns, otherwise the matrix is filled by rows.
m = matrix(nrow=2, ncol=3) # matriz vazia
m
## [,1] [,2] [,3]
## [1,] NA NA NA
## [2,] NA NA NA
Pode-se preencher todos elementos de uma matriz com um único valor informando um único escalar:
m = matrix(0, nrow=2, ncol=3) # matriz vazia
m
## [,1] [,2] [,3]
## [1,] 0 0 0
## [2,] 0 0 0
É possível construir uma matriz “preenchida” incluindo um vetor com (nº linhas $\times$ nº colunas) elementos.
m = matrix(1:6, nrow=2, ncol=3)
m
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
Os elementos do vetor 1:6 preenchem primeiro todas linhas de uma coluna para, depois, preencher a próxima coluna (column-wise). Para preencher por linha, usamos o argumento byrow=TRUE:
m = matrix(1:6, nrow=2, ncol=3, byrow=TRUE)
m
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
Note que muitas vezes é redundante informar ambos números de linhas e de colunas:
m = matrix(1:6, nrow=2, byrow=TRUE)
m
## [,1] [,2] [,3]
## [1,] 1 2 3
## [2,] 4 5 6
Podemos criar vetores-linha ou vetores-coluna inserindo, respectivamente, nrow=1 e ncol=1:
# vetor-linha
vrow = matrix(1:3, nrow=1)
vrow
## [,1] [,2] [,3]
## [1,] 1 2 3
# vetor-coluna
vcol = matrix(1:3, ncol=1)
vcol
## [,1]
## [1,] 1
## [2,] 2
## [3,] 3
Podemos criar matrizes identidade facilmente utilizando a função diag() e informando o nº de elementos na diagonal principal da matriz:
I = diag(3) # matriz identidade com 3 elementos na diagonal
I
## [,1] [,2] [,3]
## [1,] 1 0 0
## [2,] 0 1 0
## [3,] 0 0 1
Outra maneira de criar matrizes é juntando vetores em colunas (column-binding) ou em linhas (row-binding), usando as funções cbind() e rbind(), respectivamente:
# Criando 2 vetores
x = 1:3
y = 10:12
# Criando/Visualizando matrizes
X = cbind(x, y) # juntando vetores por coluna
X
## x y
## [1,] 1 10
## [2,] 2 11
## [3,] 3 12
Y = rbind(x, y) # juntando vetores por linha
Y
## [,1] [,2] [,3]
## x 1 2 3
## y 10 11 12
# Caso juntemos um escalar com um vetor, o escalar é replicado:
Z = cbind(1, y) # juntando escalar com vetor por coluna
Z
## y
## [1,] 1 10
## [2,] 1 11
## [3,] 1 12
Operações matriciais
- Vectorized operations (John Hopkins/Coursera)
- Ao utilizar as operações matemáticas convencionais em vetores, cada elemento é operacionalizado com o elemento na mesma posição do outro vetor
# Criando vetores-coluna
x = matrix(1:4, ncol=1) # vetor-coluna
y = matrix(6:9, ncol=1) # vetor-coluna
x + y # soma de cada elemento na mesma posição
## [,1]
## [1,] 7
## [2,] 9
## [3,] 11
## [4,] 13
x + 2 # soma de de cada elemento com um mesmo escalar
## [,1]
## [1,] 3
## [2,] 4
## [3,] 5
## [4,] 6
x * y # multiplicação de cada elemento na mesma posição
## [,1]
## [1,] 6
## [2,] 14
## [3,] 24
## [4,] 36
x / y # divisão de cada elemento na mesma posição
## [,1]
## [1,] 0.1666667
## [2,] 0.2857143
## [3,] 0.3750000
## [4,] 0.4444444
- Para fazer o produto vetorial usa-se
%*%. Por padrão, o R considera que o 1º vetor é um vetor-linha e o 2º é um vetor-coluna.
t(x) %*% y # Produto interno: x vetor-linha / y vetor-coluna
## [,1]
## [1,] 80
x %*% t(y) # Produto externo: x vetor-coluna / y vetor-linha
## [,1] [,2] [,3] [,4]
## [1,] 6 7 8 9
## [2,] 12 14 16 18
## [3,] 18 21 24 27
## [4,] 24 28 32 36
- O mesmo é válido para matrizes, e também é possível tomar a inversa de uma matriz quadrada usando
solve():
X = matrix(6:1, nrow=3, ncol=2)
X
## [,1] [,2]
## [1,] 6 3
## [2,] 5 2
## [3,] 4 1
Y = matrix(10, nrow=3, ncol=2)
Y
## [,1] [,2]
## [1,] 10 10
## [2,] 10 10
## [3,] 10 10
X + Y # Soma de elementos na mesma posição
## [,1] [,2]
## [1,] 16 13
## [2,] 15 12
## [3,] 14 11
X + 2 # Soma de cada elemento da matriz com um mesmo escalar
## [,1] [,2]
## [1,] 8 5
## [2,] 7 4
## [3,] 6 3
X * Y # Multiplicação de elementos na mesma posição
## [,1] [,2]
## [1,] 60 30
## [2,] 50 20
## [3,] 40 10
t(X) %*% X # Multiplicação matricial
## [,1] [,2]
## [1,] 77 32
## [2,] 32 14
solve( t(X) %*% X ) # inversa de X'X
## [,1] [,2]
## [1,] 0.2592593 -0.5925926
## [2,] -0.5925926 1.4259259
- E, é claro, dá para fazer operações entre vetor e matriz:
# Criando ps objetos
X = matrix(6:1, nrow=3, ncol=2) # matriz 3x2
X
## [,1] [,2]
## [1,] 6 3
## [2,] 5 2
## [3,] 4 1
e = matrix(-1:1, ncol=1) # vetor-coluna 3x1
e
## [,1]
## [1,] -1
## [2,] 0
## [3,] 1
t(X) %*% e # Multiplicação matricial
## [,1]
## [1,] -2
## [2,] -2
Data frames
-
Diferente de matrizes, cada elemento de um data frame pode ser de uma classe diferente
-
Normalmente um data frame é “criado” a partir da leitura de uma base de dados em .txt ou .csv via
read.table()ouread.csv()
Importando bases de arquivos
- Reading tabular data (John Hopkins/Coursera)
- Para leitura de base de dados, as funções mais utilizadas são
read.table()eread.csv() - O
read.table()tem o seguinte argumentos (que também podem ser visto nas demais funções de leitura de base de dados):file: caminho/endereço do arquivo, incluindo a sua extensãoheader:TRUEouFALSEindicando se a 1ª linha da base de dados é um cabeçalhosep: indica como as colunas são separadasstringAsFactors:TRUEouFALSEse as variáveis de texto devem ser transformadas em factors.
data_txt = read.table("mtcars.txt") # também lê .csv
data_csv = read.csv("mtcars.csv")
- Caso queira testar, faça download das bases: mtcars.txt e mtcars.csv
- Note que, caso você não tenha definido o diretório de trabalho ou queria fazer download diretamente da internet, é necessário informar o caminho/endereço inteiro da base de dados que você quer importar:
data = read.csv("C:/Users/Fabio/OneDrive/FEA-RP/mtcars.csv")
data = read.csv("https://fhnishida.netlify.app/project/rec2312/mtcars.csv")
Carregando bases de pacotes
Há algumas bases de dados já presentes no pacote base (já carregado automaticamente) do R. Para listá-las, pode-se usar a função data():
data()
## Data sets in package ‘datasets’:
##
## AirPassengers Monthly Airline Passenger Numbers 1949-1960
## BJsales Sales Data with Leading Indicator
## BJsales.lead (BJsales) Sales Data with Leading Indicator
## BOD Biochemical Oxygen Demand
## CO2 Carbon Dioxide Uptake in Grass Plants
## ChickWeight Weight versus age of chicks on different diets
## DNase Elisa assay of DNase
## (...)
É possível acessá-las apenas escrevendo seu nome. Vamos ver as 6 primeras linhas (função head()) de uma base de dados listada:
head( CO2 )
## Plant Type Treatment conc uptake
## 1 Qn1 Quebec nonchilled 95 16.0
## 2 Qn1 Quebec nonchilled 175 30.4
## 3 Qn1 Quebec nonchilled 250 34.8
## 4 Qn1 Quebec nonchilled 350 37.2
## 5 Qn1 Quebec nonchilled 500 35.3
## 6 Qn1 Quebec nonchilled 675 39.2
Além disso, é possível baixar um pacote e usar uma de suas bases de dados usando a função data(). Abaixo, vamos instalar o pacote wooldridge e carregar a de suas bases de dados gpa1:
install.packages("wooldridge") # instalando a base de dados
data(gpa1, package="wooldridge") # carregando base de dados do pacote wooldridge
head(gpa1) # visualizando 6 primeiras linhas
## age soph junior senior senior5 male campus business engineer colGPA hsGPA ACT
## 1 21 0 0 1 0 0 0 1 0 3.0 3.0 21
## 2 21 0 0 1 0 0 0 1 0 3.4 3.2 24
## 3 20 0 1 0 0 0 0 1 0 3.0 3.6 26
## 4 19 1 0 0 0 1 1 1 0 3.5 3.5 27
## 5 20 0 1 0 0 0 0 1 0 3.6 3.9 28
## 6 20 0 0 1 0 1 1 1 0 3.0 3.4 25
## job19 job20 drive bike walk voluntr PC greek car siblings bgfriend clubs
## 1 0 1 1 0 0 0 0 0 1 1 0 0
## 2 0 1 1 0 0 0 0 0 1 0 1 1
## 3 1 0 0 0 1 0 0 0 1 1 0 1
## 4 1 0 0 0 1 0 0 0 0 1 0 0
## 5 0 1 0 1 0 0 0 0 1 1 1 0
## 6 0 0 0 0 1 0 0 0 1 1 0 0
## skipped alcohol gradMI fathcoll mothcoll
## 1 2 1.0 1 0 0
## 2 0 1.0 1 1 1
## 3 0 1.0 1 1 1
## 4 0 0.0 0 0 0
## 5 0 1.5 1 1 0
## 6 0 0.0 0 1 0
Extraindo subconjuntos de data frames
- Subsetting - Matrices (John Hopkins/Coursera)
- Para extrair um pedaço de uma matriz ou de um data frame, indicamos as linhas e as colunas dentro do operador
[] - Como exemplo, vamos usar a base de dados
mtcars:
head(mtcars) # Visualizando 6 primeiras linhas
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
mtcars[1, 2] # linha 1 e coluna 2 da matriz X
## [1] 6
mtcars[1:2, 3:4] # linha 1 e colunas 3 e 4 da matriz X
## disp hp
## Mazda RX4 160 110
## Mazda RX4 Wag 160 110
- Podemos selecionar linhas ou colunas inteiras ao não informar os índices:
mtcars[1, ] # linha 1 e todas colunas
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
mtcars[, c(1, 4)] # todos valores das colunas 1 e 4
## mpg hp
## Mazda RX4 21.0 110
## Mazda RX4 Wag 21.0 110
## Datsun 710 22.8 93
## Hornet 4 Drive 21.4 110
## Hornet Sportabout 18.7 175
## Valiant 18.1 105
## Duster 360 14.3 245
## Merc 240D 24.4 62
## Merc 230 22.8 95
## Merc 280 19.2 123
## Merc 280C 17.8 123
## Merc 450SE 16.4 180
## Merc 450SL 17.3 180
## Merc 450SLC 15.2 180
## Cadillac Fleetwood 10.4 205
## Lincoln Continental 10.4 215
## Chrysler Imperial 14.7 230
## Fiat 128 32.4 66
## Honda Civic 30.4 52
## Toyota Corolla 33.9 65
## Toyota Corona 21.5 97
## Dodge Challenger 15.5 150
## AMC Javelin 15.2 150
## Camaro Z28 13.3 245
## Pontiac Firebird 19.2 175
## Fiat X1-9 27.3 66
## Porsche 914-2 26.0 91
## Lotus Europa 30.4 113
## Ford Pantera L 15.8 264
## Ferrari Dino 19.7 175
## Maserati Bora 15.0 335
## Volvo 142E 21.4 109
- Também é possível selecionar diversas colunas usando os nomes delas:
# 1a forma: incluindo vetor com os nomes dentro de []
mtcars[, c("mpg", "hp")] # todos valores das colunas 2 e 4
## mpg hp
## Mazda RX4 21.0 110
## Mazda RX4 Wag 21.0 110
## Datsun 710 22.8 93
## Hornet 4 Drive 21.4 110
## Hornet Sportabout 18.7 175
## Valiant 18.1 105
## Duster 360 14.3 245
## Merc 240D 24.4 62
## Merc 230 22.8 95
## Merc 280 19.2 123
## Merc 280C 17.8 123
## Merc 450SE 16.4 180
## Merc 450SL 17.3 180
## Merc 450SLC 15.2 180
## Cadillac Fleetwood 10.4 205
## Lincoln Continental 10.4 215
## Chrysler Imperial 14.7 230
## Fiat 128 32.4 66
## Honda Civic 30.4 52
## Toyota Corolla 33.9 65
## Toyota Corona 21.5 97
## Dodge Challenger 15.5 150
## AMC Javelin 15.2 150
## Camaro Z28 13.3 245
## Pontiac Firebird 19.2 175
## Fiat X1-9 27.3 66
## Porsche 914-2 26.0 91
## Lotus Europa 30.4 113
## Ford Pantera L 15.8 264
## Ferrari Dino 19.7 175
## Maserati Bora 15.0 335
## Volvo 142E 21.4 109
# 2a forma: usando $ (possível selecionar apenas 1 coluna)
mtcars$mpg
## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4
Novas variáveis em data frames
- Podemos criar novas variáveis usando os operadores
$para nomear uma nova coluna e=para atribuir um vetor. - Normalmente, preenchemos essa nova variável a partir da informação de outras variáveis pré-existentes.
- Usando a base de dados
mtcars, vamos criar as variáveis:mpg2: variávelmpgao quadrado,mpg_neg: negativo dempg(multiplicado por -1),mpg_neg_abs: valor absoluto dempg_negmpg_am: interação (multiplicação) da variávelmpgcom aam, que é uma variável dummy (valores são apenas 0 e 1)
mtcars$mpg2 = mtcars$mpg ^ 2 # mpg ao quadrado
mtcars$mpg_neg = mtcars$mpg * (-1) # negativo de mpg
mtcars$mpg_neg_abs = abs(mtcars$mpg_neg)# absoluo do negativo de mpg
mtcars$mpg_am = mtcars$mpg * mtcars$am # interação entre mpg e am
head(mtcars) # primeiras 6 linhas de mtcars
## mpg cyl disp hp drat wt qsec vs am gear carb mpg2
## Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 441.00
## Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 441.00
## Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 519.84
## Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1 457.96
## Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2 349.69
## Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1 327.61
## mpg_neg mpg_neg_abs mpg_am
## Mazda RX4 -21.0 21.0 21.0
## Mazda RX4 Wag -21.0 21.0 21.0
## Datsun 710 -22.8 22.8 22.8
## Hornet 4 Drive -21.4 21.4 0.0
## Hornet Sportabout -18.7 18.7 0.0
## Valiant -18.1 18.1 0.0