#/////////////////////////////////////////////////////////////////////// # Especialização em Advanced Analytics & Business Optimation # Ferramentas Computacionais e Inteligência Artificial (FCAI) # # Prof. Dr. Walmes M. Zeviani # walmeszeviani.com · github.com/walmes · @walmeszeviani #/////////////////////////////////////////////////////////////////////// #/////////////////////////////////////////////////////////////////////// # Mudar o diretório de trabalho ---- # getwd() # setwd("~/Desktop/fcai-aula01") #/////////////////////////////////////////////////////////////////////// # Aritmética básica ---- 2 + 5 3 - 3 9 * 8 3 / 4 3^2 3 ** 2 10 %/% 3 10 %% 3 #/////////////////////////////////////////////////////////////////////// # Tipos de valores ---- 45L # interger 23.45 # float/double "R é uma linguagem fabulosa" TRUE FALSE T F typeof(10L) typeof(23.1) typeof("Texto") typeof(TRUE) is.integer(10L) is.numeric(23.3) is.numeric(20L) is.character("Olá") is.logical(TRUE) as.logical(0) as.logical(-1) as.logical(302) as.integer("x320") / 2 NA NaN Inf log(-100) sqrt(-10) 0 / 0 #/////////////////////////////////////////////////////////////////////// # Atribuição ---- x <- 2 y <- 10 z <- 102 x * 3 x100 <- 10 x_10 <- 10 minha_tabela <- 10 minha.tabela <- 10 # Evitar! .dados <- 10 minha_tabela_organizada # Snake case minhaTabelaOrganizada # Cammel case MinhaTabelaOrganizada # Pascal case minha.tabela.organizada # Dot case .dados * 30 rm(x) rm(list = objects()) x <- 10 x <- TRUE x <- "Texto" # `+`(2, 3) # `*`(2, 3) assign("j", 8) # j <- 8 get("j") #/////////////////////////////////////////////////////////////////////// # Aritmética de booleanos ---- TRUE & TRUE TRUE & FALSE FALSE & FALSE TRUE | TRUE TRUE | FALSE FALSE | FALSE !(TRUE) # &&, || #/////////////////////////////////////////////////////////////////////// # Artimética de vetores ---- usuarios <- c("Monica", "Alex", "Pedro", "Simone") usuarios usuarios[1] usuarios[1:3] usuarios[-1] usuarios[c(2, 4)] str(usuarios) class(usuarios) length(usuarios) head(usuarios) tail(usuarios) # usuarios <- c(usuarios, "Dimas") usuarios <- append(usuarios, "Dimas") # Usando valores lógicos. usuarios[c(T, T, T, F, F)] notas <- c(10, 7, 6, 4, 9) notas > 5 usuarios[notas > 5] usuarios[notas >= 7] usuarios[notas == 10] usuarios[notas != 10] # >, <, >=, <=, ==, !=, %in% usuarios[notas >= 4 & notas < 7] notas <- c( "Monica" = 10, "Alex" = 7, "Pedro" = 6, "Simone" = 4, "Dimas" = 9, "Dimas" = 7 ) str(notas) notas["Dimas"] names(notas) attr(notas, "names") `meu saldo` <- -100 objects() `meu saldo` + 150 3 * 2 + 1 (20/2)/(3/2) # Regra da reciclagem ---- notas + 1 notas + c(1, 0) # 1, 0, 1, 0, 1 rev(c(1, 0)) rev(1:5) # Sequências. 1:4 1.5:4.5 1.5:5 seq(from = 1, to = 4, by = 0.5) # Repetições. rep(1:4, each = 2) rep(1:4, times = 2) seq(from = 8, by = 10, length.out = 50) #/////////////////////////////////////////////////////////////////////// # Acesso a documentação ---- help(c) help(seq) help(rep) help.search("boxplot") help.search("correlation") help.search("shapiro wilk") RSiteSearch("missign data imputation") #/////////////////////////////////////////////////////////////////////// # Matrizes ---- M <- matrix(1:24, ncol = 4, nrow = 6, byrow = TRUE) M dim(M) M[5,] M[,3] M[4:5,] M[,3:4] M[,-1] M[-1,-1] M[5, , drop = FALSE] M[ ,3, drop = FALSE] K <- matrix(1:6, ncol = 2, nrow = 3, dimnames = list(c("A", "B", "C"), c("I","II"))) K K["B",, drop = FALSE] K[,"II", drop = FALSE] rownames(K) <- c("L1","L2","L3") colnames(K) <- c("C1","C2") K y <- cbind(c(50, 30, 60, 53, 69)) y # y = \beta_0 + \beta_1 * x + e # Y = X \beta + e X <- cbind(1, c(5, 3.1, 5.9, 5.5, 6.8)) X # \hat{\beta} = (X'X)^-1 X'y. solve(t(X) %*% X) t(X) %*% y solve(t(X) %*% X) %*% t(X) %*% y # t() # solve() # diag() is.matrix(X) is.array(X) # Array. Z <- array(c(1:12), dim = c(3, 2, 2)) Z Z[,,1] Z[,,2] Z[1,,] Z[1,,,drop = FALSE] #/////////////////////////////////////////////////////////////////////// # Listas ---- L <- list( 1:4, matrix(1:4, 2, 2), c(TRUE, TRUE, FALSE), c("R", "Python", "Bash", "C++"), list(LETTERS[1:4], letters[1:4]) ) L[1] L[[1]] L[-1] L[1:2] L[c(1, 3)] L[[5]][[2]] L <- list( "num" = 1:4, "one_list" = list("maius" = LETTERS[1:4], "minus" = letters[1:4]), "bool" = c(TRUE, TRUE, FALSE), "mat" = matrix(1:4, 2, 2), "string" = c("R", "Python", "Bash", "C++") ) L[["one_list"]][["minus"]] L <- append(L, c("work_dir" = getwd())) L L[["work_dir"]] <- NULL L L[["bool"]] <- append(L[["bool"]], c(FALSE, FALSE)) L[["bool"]] names(L) str(L) is.list(L) #/////////////////////////////////////////////////////////////////////// # Data frame ---- tb <- data.frame( aluno = c("Rodrigo", "Márcia", "Lúcia", "Ana", "Cesar", "Lucas"), notas = c(7, 9, 6, 8, 6, 7), faltas = c(10, 10, 15, 10, 0, 0), curso = c("EE", "EE", "EC", "EC", "EE", "EC") ) str(tb) is.list(tb) tb[[1]] tb[["aluno"]] tb$aluno tb[1,] tb[1:2,] tb[c(1, 3),] tb[,c("notas", "faltas")] tb[,2] tb[,2, drop = FALSE] tb$condicao <- ifelse(tb$notas >= 7 & tb$faltas < 25, "Aprovado", "Reprovado") str(tb) tb tb[tb$condicao == "Aprovado", ] tb[tb$curso == "EE", ] tb[tb$faltas == 0, ] tb[tb$faltas > 0 & tb$condicao == "Aprovado", ] mask <- tb$faltas > 0 & tb$condicao == "Aprovado" tb[mask, ] tb[!mask, ] #/////////////////////////////////////////////////////////////////////// # Estrutura de controle ---- x <- "100" if (!is.numeric(x)) { x <- as.numeric(x) } x x <- c(6.5, 7.5) if (x >= 7) { resultado <- "Aprovado" } else { resultado <- "Reprovado" } resultado x <- as.Date("2026-01-01") if (is.character(x)) { print("x é caracter") } else if (is.integer(x)) { print("x é inteiro") } else if (is.logical(x)) { print("x é booleano") } else if (is.numeric(x)) { print("x é númerico") } else { print("não sei o que é x") } x <- runif(10) x metodo <- "trimed mean" switch(metodo, "mean" = { mean(x) }, "median" = { median(x) }, "trimed mean" = { mean(x, trim = 0.05) },{ "Método não disponível" }) #/////////////////////////////////////////////////////////////////////// # Métodos genéricos e funções ---- precip hist(precip) stem(precip) boxplot.numeric(precip) # Com o cursos sobre a palavra, pressione F2. boxplot methods(generic.function = "boxplot") boxplot.default methods(generic.function = "t.test") #/////////////////////////////////////////////////////////////////////// # Caminhos de procura e espaços de memória (namespaces) ---- # Lista os objetos de um namespace. ls("package:stats") search() ls() women find("women") ls("package:datasets") women <- 10 datasets::women library(dplyr) find("filter") #/////////////////////////////////////////////////////////////////////// # Loops ---- # for ---- capital_investido <- 100 juros_mensal <- 0.01 # Evite isso. resultados <- numeric(0) for (n_meses in 1:12) { resultado <- capital_investido * (1 + juros_mensal)^n_meses resultados <- append(resultados, resultado) } # Código eficiente. resultados <- numeric(12) for (n_meses in 1:12) { resultado <- capital_investido * (1 + juros_mensal)^n_meses resultados[n_meses] <- resultado } resultados # while ---- capital_investido <- 100 juros_mensal <- 0.01 mes <- 1 resultado <- capital_investido * (1 + juros_mensal) while (resultado < 150) { mes <- mes + 1 resultado <- resultado * (1 + juros_mensal) } resultado mes # repeat ---- capital_investido <- 100 juros_mensal <- 0.01 mes <- 1 resultado <- capital_investido * (1 + juros_mensal) repeat { mes <- mes + 1 resultado <- resultado * (1 + juros_mensal) if (resultado >= 150) break } mes resultado # Uso do next ---- capital_investido <- 100 juros_mensal <- 0.01 mes <- 0 repeat { if (mes == 0) { mes <- 1 resultado <- capital_investido * (1 + juros_mensal) next } mes <- mes + 1 resultado <- resultado * (1 + juros_mensal) if (resultado >= 150) break } mes resultado # while como repeat ---- capital_investido <- 100 juros_mensal <- 0.01 mes <- 0 while (TRUE) { if (mes == 0) { mes <- 1 resultado <- capital_investido * (1 + juros_mensal) next } mes <- mes + 1 resultado <- resultado * (1 + juros_mensal) if (resultado >= 150) break } #///////////////////////////////////////////////////////////////////////