Exercícios com resolução ## Aula 01 ### R como calculadora 1. Calcule o número de ouro no R ($\frac{1 + \sqrt{5}}{2}$). 2. O que dá divisão de 1 por 0? E -1 por 0? 3. Quais as diferenças entre `NaN`, `NULL`, `NA` e `Inf`? 4.a) Tente mentalmente calcular o que dá a conta `5 + 3 * 10 %/% 3 == 15` no R, sem rodar. 4.b) Adicionando apenas parênteses, faça a expressão acima retornar o resultado contrário. ### Flow Controls 1.a) O que acontece se eu rodar ```{r, echo = F} .Random.seed <- 121321 ``` ```{r, eval=FALSE} x <- 4 if(x = 4) { 'isso aqui apareceu' } x require(abjutils) data(pnud_muni, package='abjutils') require(dplyr) dados2010 <- pnud_muni[ pnud_muni$ano==2010, c('uf', 'ufn')] dados2010$uf2 <- paste(dados2010$uf, dados2010$ufn) unique(dados2010$uf2) ``` Você notou alguma coisa estranha? Como o R se comporta nesse caso? 1.b) Como você modificaria esse código para não dar erro e aparecer a frase 'isso aqui apareceu'? Obs: Existem duas formas de modificar o código que farão ele funcionar. 2. Escreva a frase (em uma linha) > 1 elefante(s) incomoda(m) muita gente > 2 elefante(s) incomoda(m) incomoda(m) muito mais > 3 elefante(s) incomoda(m) muita gente > 4 elefante(s) incomoda(m) incomoda(m) incomoda(m) incomoda(m) muito mais usando `for` ou `while`. ```{r results='hide', eval=FALSE, echo=FALSE} n <- 4 for(i in 1:n) { parte1 <- paste(i, "elefantes") parte2 <- "" for(j in 1:ifelse(i%%2==0,i,1)) { parte2 <- paste(parte2, "incomoda(m)") } parte3 <- ifelse(i%%2 == 0, "muito mais", "muita gente") verso <- paste(parte1, parte2, ' ', parte3, sep = '') print(verso) } ``` ### Funções 1. Crie uma funçao que recebe um vetor de numeros e devolve a variancia. 2. Calcule a variancia de `x <- 1:100` utilizando a sua funcao criada no item 1 e utilizando a funcao `var()` do R. Compare seus resultados. Eles coincidem? Por que? 3. Altere sua funcao para que agora ela aceite que o usuario escolha entre qual tipo de variancia ela quer calcular. Certifique-se que ela devolva 4. Construa uma funcao que recebe dois vetores numericos de mesmo tamanho, `v1` e `v2`, e retorne a media ponderada de `v1` por `v2`. Calcule a média ponderada do vetor `v1 <- c(11, 9, 8, 7, 11, 6, 7, 9)` utilizando como pesos o vetor `v2 <- c(1, 2, 1, 2, 1, 2, 1, 2)`. BONUS: certifique que o usuario tenha passado vetores de tamanhos iguais e ambos numericos. Retorne `NULL` caso uma dessas condicoes falhe. 5. Crie uma versao da funcao `paste()` que una palavras pulando linhas (`\\n`) 6. Crie uma função que recebe um vetor de characters e um vetor numérico de mesmo comprimento e imprima um texto com os nomes dessas variáveis, um símbolo de atribuição (`<-`), e os números, separando cada expressão pulando linhas. Por exemplo: ```{r eval=FALSE, results='hide'} x <- letters[1:10] y <- 10:1 imprime_coisas_legais(x, y) ``` ```{r eval=FALSE, results='hide'} a <- 10 b <- 9 c <- 8 d <- 7 e <- 6 f <- 5 g <- 4 h <- 3 i <- 2 j <- 1 ``` ## Aula 02 ### Estruturas de dados **1**. O senhor Adalberto é dono de uma loja e, utilizando o R, ele quer criar um cadastro de seus clientes. Para isso, ele está armazenando as informações em uma matriz da seguinte maneira: ```{r, eval=FALSE} cadastro <- matrix(c(NA, NA, NA, NA), nrow = 100, ncol = 4, dimnames = list(NULL, c("Nome", "Idade", "Cidade", "Telefone"))) cadastro[1,] <- c("Maria das Dores", 56, 3025-111, "São Paulo") cadastro[2,] <- c("José Aníbal", 40, 3333-012, "Santos") cadastro[3,] <- c("Pedro Silva", 23, 3091-777, "São Paulo") # ... ``` a) O que faz o argumento `dimnames =`? O que significa o primeiro argumento da lista ser `NULL`? b) O que vai acontecer se o senhor Adalberto tentar tirar a média da idade dos seus clientes fazendo `mean(cadastro[,2])`? Como ele poderia calcular essa média sem mudar a estrutura do objeto `cadastro`? c) No lugar de `matrix`, qual seria a melhor estrutura para se utilizar neste caso? **2**. Por que `0.1 == 0.3/3` retorna `FALSE`? ### Subsetting **1**. Considere o `data.frame` *diamonds* do R: a) Como você faria para permutar aleatoriamente as colunas? b) É possível permutar linhas e colunas simultaneamente em um passo? c) Como ordenar as colunas do banco de dados em ordem alfabética? d) Crie uma nova variável no banco de dados que seja 1 se o preço (`price`) for menor 300 e 0 caso contrário. **2**. Considere o vetor abaixo: ```{r} x1 <- 1:8 ``` a) Por que a expressao `x1 == c(2,3)` não retorna as posições de `x1` que são iguais a 2 ou 3? b) O que faz o operador `%in%`? ### Leitura de dados 1. Vamos supor que o seu diretório de trabalho seja `"Desktop/pasta1/pasta2"` e que dentro da *pasta2* você tenha uma *pasta3*. Sem mudar o diretório de trabalho, escreva um código, utilizando a função `read.table()`, para ler um arquivo que esteja a) dentro da *pasta3*. b) dentro da *pasta1*. 2. É possível ler um arquivo em que o separador de valores (`sep`) é igual ao separador de casas deciamais (`dec`)? 3. Qual a diferença entre as funções `read.csv()` e `read.csv2()`? ### O operador *pipe* 1. Reescreva a expressão abaixo utilizando o operador `%>%`. ```{r} x <- 0.1 library(ggplot2) qplot(x=sample(sqrt((log(seq(1, 10, x)) + 2)), 40, replace = T), geom="histogram") ``` 2. Para que servem os operadores: a) `%<>%`? b) `%T>%`? c) `%$%`? ### Gráficos com o pacote *graphics* **1**. Considere o gráfico abaixo: ```{r} x <- seq(-3, 3, 0.01) y <- 1/x plot(x, y, type = "l") ``` a) Altere os limites do eixo x para que o gráfico seja visualizado apenas do -2 ao 2. b) Acrescente um título ao grafico. C) Acrescente uma reta vertical pontilhada no ponto x = 0. d) Acrescente uma legenda ao gráfico no "terceiro quadrante". **2**. Como construir dois gráficos na mesma janela? ## Aula 04 A base de dados `bd_dyad_sample` (leia executando `data(bd_dyad_sample, package='abjutils')`) contém em cada linha uma coalizão ocorrida ou não na Organização Mundial do Comércio, entre dois países. Os países estão identificados pelas colunas `ccode1` e `ccode2`. A coalizão é identificada pela variável `Freq` ou a variável `coalition`, que são iguais e valem `1` se houve coalizão e `0` caso contrário. A coluna `ccoalition` é um identificador de qual foi a coalizão que aconteceu (Mercosul, acordos da Europa, etc). As outras medidas da base são basicamente medidas de distância entre caracteísticas dos países em relação a um dado ano. Por exemplo, `pwt_lrgdp` mede a diferença (em log) dos PIBs dos países, e `dist_latlon` mede a distância dos países. ### Tidy data **1**. Qual é a unidade observacional (o que identifica uma observação)? ### select, filter, mutate, arrange, summarise, gather, spread **2**. Qual é o código do país que entrou mais vezes em alguma coalizão? **3**. Qual é o código do país que entrou em coalizão com mais países? **4**. Quantas coalizões tivemos em cada ano? **5**. Construa uma matriz de adjacências usando `dplyr`. Queremos um `data.frame` com número de linhas igual ao número de colunas, e o conteúdo da tabela é `1` se o país da linha entra em coalizão com o país da coluna em dado ano e dada coalizão, e `0` caso contrário. ## Aula 05 ### ggplot2 **1** Como adicionar um título a um gráfico? **2** Como alterar a posição da legenda de um gráfico? Como removê-la? **3** Como personalizar os eixos de um gráfico? **Dica**: consulte esse [site](http://www.cookbook-r.com/Graphs/Legends_(ggplot2)/). Para fazer os exercícios abaixo, utilize o banco de dados `movies` do pacote `ggplot2`. **4** Faça um gráfico de barras mostrando o número de filmes por ano de 1990 para cá. **5** Faça boxplots da classificação (rating) para cada classificação da MPAA. Adicione ao gráfico uma linha vermelha pontilhada horizontal que cruze o eixo y no valor 5. **6** Faça histogramas da classificação (rating) para cada gênero de filme. **Dica**: para plotar uma reta horizontal, utilize a função `geom_hline()`. ## Aula 06 ## Aula 07 ## Aula 08 ## Aula 09 ## Aula 10 ## Aula 11 ## Aula 12