Análise de Dados em R (FNDE) - Módulo 1

Sessão 4 - Operadores lógicos e comandos de decisão

Allan Vieira
janeiro de 2018

Objetivos desta Sessão


  • Conhecer noções básicas de lógica de programação;

  • Conhecer algumas funções “lógicas” no R.

Conceituação

  • técnicas de lógica de programação são extremamente úteis para resolver diversos problemas em análise de dados;

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

Operadores Relacionais


operador ação
== igual a
!= diferente de
>= maior ou igual a
> maior que
< menor que
<= menor ou igual a

Operadores Lógicos


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)

Operadores Lógicos - Exemplos

# 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

Funções Lógicas "mão na roda" do R (1)

  • Vamos criar os seguintes objetos:
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

Funções Lógicas "mão na roda" do R (2)

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

Expressões Condicionais - Definição

  • As expressões condicionais if (“SE”) e else (“SENÃO”) são MUITO utilizadas em qualquer linguagem de programação.

  • Estrutura mais utilizada é:

alt text

  • 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)

Expressões Condicionais - Exemplo 1

## 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

Expressões Condicionais - Exemplo 2

# 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!!
  • Já pensou em como criar uma coluna nova num dataframe já existente?
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

Exercício

  • Crie o data-frame:
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:

    • se o aluno está em fase de utilização OU carência, incide taxa de 0.015 (1.5 %);
    • se está em fase de amortização, incide taxa de 0.03 (3 %);
  • 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} \]