-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy path9872-respostas-purrr.Rmd
122 lines (87 loc) · 2.73 KB
/
9872-respostas-purrr.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
```{r, include=FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
fig.align = "center"
)
imdb <- readr::read_rds("assets/data/imdb.rds")
```
## Programação funcional (purrr)
```{r, message = FALSE, warning = FALSE}
library(dplyr)
library(purrr)
library(ggplot2)
```
**1.** Utilize a função `map()` para calcular a média de cada coluna da base `mtcars`.
```{r}
map(mtcars, mean)
```
---
**2.** Use a função `map()` para testar se cada elemento do vetor `letters` é uma vogal ou não. Dica: você precisará criar uma função para testar se é uma letra é vogal. Faça o resultado ser (a) uma lista de `TRUE/FALSE` e (b) um vetor de `TRUE/FALSE`.
```{r}
testar_vogal <- function(x) {
if(x %in% c("a", "e", "i", "o", "u")) {
return(TRUE)
} else {
return(FALSE)
}
}
# retornando uma lista
map(letters, testar_vogal)
# retornando um vetor (2 soluções equivalentes)
map(letters, testar_vogal) %>% flatten_lgl()
map_lgl(letters, testar_vogal)
```
---
**3** Faça uma função que divida um número por 2 se ele for par ou multiplique ele por 2 caso seja ímpar. Utilize uma função `map` para aplicar essa função ao vetor `1:100`. O resultado do código deve ser um vetor numérico.
```{r}
operacao <- function(x) {
if (x %% 2 == 0) {
return(x / 2)
} else {
return(x * 2)
}
}
operacao(2)
operacao(3)
map_dbl(1:100, operacao)
```
---
**4.** Use a função `map()` para criar gráficos de dispersão da receita vs orçamento para os filmes da base `imdb`. Os filmes de cada ano deverão compor um gráfico diferente. Faça o resultado ser (a) uma lista de gráficos e (b) uma nova coluna na base `imdb` (utilizando a função `tidyr::nest()`).
```{r, eval = FALSE}
imdb <- readr::read_rds("imdb.rds")
# gerando uma lista de gráficos
fazer_grafico <- function(tab, ano_) {
tab %>%
filter(ano == ano_) %>%
ggplot(aes(x = orcamento, y = receita)) +
geom_point()
}
anos <- unique(imdb$ano)
graficos <- map(anos, fazer_grafico, tab = imdb)
# gerando uma coluna na tabela imdb
fazer_grafico2 <- function(tab) {
tab %>%
ggplot(aes(x = orcamento, y = receita)) +
geom_point()
}
imdb_com_graficos <- imdb %>%
group_by(ano) %>%
tidyr::nest() %>%
mutate(
grafico = map(data, fazer_grafico2)
)
```
---
**5.** Utilize a função `walk` para salvar cada ano da base `imdb` em um arquivo `.rds` diferente, isto é, o arquivo `imdb_2001.rds`, por exemplo, deve conter apenas filmes do ano de 2001.
```{r, eval = FALSE}
imdb <- readr::read_rds("imdb.rds")
salvar_base <- function(tab, ano_) {
tab %>%
filter(ano == ano_) %>%
readr::write_rds(file = paste0("teste/imdb_", ano_, ".rds"))
}
anos <- imdb %>%
filter(!is.na(ano)) %>%
pull(ano)
walk(anos, salvar_base, tab = imdb)
```