Análise de Dados em R (FNDE) - Módulo 1
Allan Vieira
janeiro de 2018
R possui operadores lógicos e relacionais que vão compor uma determinada expressão lógica ou condição
“Condição” é uma expressão que pode ser VERDADEIRA ou FALSA
operador | ação |
---|---|
== | igual a |
!= | diferente de |
>= | maior ou igual a |
> | maior que |
< | menor que |
<= | menor ou igual a |
operador | ação |
---|---|
|| | OU lógico (para 1 elemento) |
&& | E lógico (para 1 elemento) |
! | negação |
| | OU lógico (funcionamento vetorial) |
& | E lógico (funcionamento vetorial) |
# com números:
3 > 2
[1] TRUE
23 < 15
[1] FALSE
7 == 5
[1] FALSE
7 >= 7
[1] TRUE
8 <= 3
[1] FALSE
4 != 4
[1] FALSE
# com vetores:
x <- c(1,2,9,4,5)
y <- c(1,2,6,7,8)
x > y
[1] FALSE FALSE TRUE FALSE FALSE
x < y
[1] FALSE FALSE FALSE TRUE TRUE
x == y
[1] TRUE TRUE FALSE FALSE FALSE
x >= y
[1] TRUE TRUE TRUE FALSE FALSE
x != y
[1] FALSE FALSE TRUE TRUE TRUE
vetor1 <- c(12, 43.8, NA, 67, 12)
vetor2 <- c(2, 90, 360, 23, 2)
vetor3 <- c("BB", "CEF", "CEF", "BB", "BB")
vetor4 <- c("CEF", "BB", "CEF", "BB", "CEF" )
df <- data.frame("valor"=vetor1, "atraso"=vetor2, "banco_atual"=vetor3,"banco_anterior"=vetor4)
# obtendo índices para uma condição
which(vetor2 > 60) # poderia usar ==, <=, ...
[1] 2 3
# trazendo os valores que atendem a condição
vetor2[which(vetor2 > 60)]
[1] 90 360
which.min(vetor1) # índice do valor mínimo
[1] 1
which.max(df$atraso) # índice do valor máximo
[1] 3
# toda a linha do aluno com maior tempo de atraso
df[which.max(df$atraso), ]
valor atraso banco_atual banco_anterior
3 NA 360 CEF CEF
# todas as linhas, MENOS a do com maior tempo de atraso
df[-which.max(df$atraso), ]
valor atraso banco_atual banco_anterior
1 12.0 2 BB CEF
2 43.8 90 CEF BB
4 67.0 23 BB BB
5 12.0 2 BB CEF
# saber se existem repetições no dataframe
any( duplicated(df) )
[1] TRUE
# quais linhas estão repetidas?
duplicated(df)
[1] FALSE FALSE FALSE FALSE TRUE
df[duplicated(df), ]
valor atraso banco_atual banco_anterior
5 12 2 BB CEF
# ficar só com as linhas que não se repetem
unique(df)
valor atraso banco_atual banco_anterior
1 12.0 2 BB CEF
2 43.8 90 CEF BB
3 NA 360 CEF CEF
4 67.0 23 BB BB
Vamos criar os seguintes objetos:
PTRES1 <- c( 128435, 129030, 087432, 129315 , 128414)
PTRES2 <- c( 128435, 129130, 087432, 129325 , 128414 )
setdiff(PTRES1, PTRES2) # diferença de conjuntos
[1] 129030 129315
intersect(PTRES1, PTRES2) # interseção
[1] 128435 87432 128414
which(PTRES1 %in% PTRES2) # índices da interseção
[1] 1 3 5
which(!PTRES1 %in% PTRES2) # índices da diferença
[1] 2 4
As expressões condicionais if (“SE”) e else (“SENÃO”) são MUITO utilizadas em qualquer linguagem de programação.
Estrutura mais utilizada é:
Para objetos que tem comprimento 1, deve-se utilizar a estrutura acima.
Quando se deeseja percorrer todas as entradas de um vetor deve usar a função específica do R ifelse( ):
ifelse(expressão_lógica_no_vetor, o que_fazer_caso_TRUE, o_que_fazer_caso_FALSE)
## Condições:
# testando um único valor
a = 10
if (a == 10){
print("o resultado foi verdadeiro")
} else {
print("o resultado foi falso")
}
[1] "o resultado foi verdadeiro"
a = 15
b = 7
if (a == 10 && b < 10 ){
y <- c(1, "verdadeiro")
} else {
y <- c(0, "falso")
}
y
[1] "0" "falso"
# brinque de alterar os valores de "a" e "b" e os operadores relacionais
# faça outros tipos de atribuição também
# trabalhando com vetores
x <- c("cat", "dog", "bird", "tree", "leaf", "log","shark","chicken")
ifelse(x == "leaf", "eba!", "ahhh!")
[1] "ahhh!" "ahhh!" "ahhh!" "ahhh!" "eba!" "ahhh!" "ahhh!" "ahhh!"
# ifelse com atribuições
( resultado <- ifelse(x == "leaf", "eba!", "ahhh!") )
[1] "ahhh!" "ahhh!" "ahhh!" "ahhh!" "eba!" "ahhh!" "ahhh!" "ahhh!"
# usando operadores lógicos para vetores
( resultado <- ifelse(x == "leaf" | x == "dog", "eba!", "ahhh!") )
[1] "ahhh!" "eba!" "ahhh!" "ahhh!" "eba!" "ahhh!" "ahhh!" "ahhh!"
# lembre-se que um único & e um único | são os operadores lógicos
#... que devem ser utilizados quando temos vetores.
# senão, o R só avalia a condição para o primeiro elemento do vetor!!
df$col <- ifelse(df$banco_atual == "BB", 1, 0)
df
valor atraso banco_atual banco_anterior col
1 12.0 2 BB CEF 1
2 43.8 90 CEF BB 0
3 NA 360 CEF CEF 0
4 67.0 23 BB BB 1
5 12.0 2 BB CEF 1
col1 <- c(2356.89, 4377.8, 5200, 350.00, 50, 4377.8, 5200)
col2 <- c(12, 24, 15, 23, 45, 24, 15)
col3 <- c("BB", "CEF", "CEF", "BB", "BB", "CEF", "CEF")
col4 <- c("utilização", "utilização", "amortização", "carência", "utilização", "utilização", "amortização")
( df <- data.frame("valor"=col1, "atraso"=col2, "banco"=col3,"fase"=col4) )
Objetivo: Corrigir os valores devidos pelos alunos.
Tarefas:
Limpe os dados (elimine linhas repetidas);
Crie uma nova coluna chamada “taxa_juros_mes” neste mesmo dataframe, em que:
Crie uma nova coluna chamada “novo_valor”, que é o resultado da aplicação da taxa de juros (composta) no valor devido (coluna “valor”), considerando o nro de dias em atraso.
Calcule a diferença entre o valor total devido depois e antes da aplicação da taxa.
OBS: A fórmula da taxa de juros compostos é:
\[ M = C(1+i)^{t} \]