-
Notifications
You must be signed in to change notification settings - Fork 7
/
9841-respostas-dplyr.Rmd
322 lines (222 loc) · 7.25 KB
/
9841-respostas-dplyr.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
## O pacote dplyr
```{r, include=FALSE}
imdb <- readr::read_csv("assets/data/imdb.csv")
```
```{r, message=FALSE, warning=FALSE}
library(dplyr)
```
### Selecionando colunas {-}
Utilize a base `imdb` nos exercícios a seguir.
**1.** Teste aplicar a função `glimpse()` do pacote `{dplyr}` à base `imdb`. O que ela faz?
```{r}
glimpse(imdb)
```
*A função `glimpse()` traz um resumo da base, contendo o número de linhas, colunas, o nome e tipo das colunas e as primeiras observações de cada coluna.*
---
**2.** Crie uma tabela com apenas as colunas `titulo`, `direcao`, e `orcamento.` Salve em um objeto chamado `imdb_simples`.
```{r}
imdb_simples <- select(imdb, titulo, direcao, orcamento)
imdb_simples
```
---
**3.** Selecione apenas as colunas `duracao`, `direcao`, `descricao` e `producao` usando a função auxiliar `contains()`.
```{r}
select(imdb, contains("cao"))
```
---
**4.** Usando a função `select()` (e suas funções auxiliares), escreva códigos que retornem a base IMDB sem as colunas `num_avaliacoes`, `num_criticas_publico` e `num_criticas_critica`. Escreva todas as soluções diferentes que você conseguir pensar.
```{r, eval = FALSE}
select(imdb, -starts_with("num"))
select(imdb, -num_avaliacoes, -num_criticas_publico, -num_criticas_critica)
select(imdb, id_filme:nota_imdb, direcao)
select(imdb, -contains("num"))
```
### Ordenando a base {-}
**1.** Ordene os filmes em ordem crescente de `ano` e decrescente de `receita` e salve em um objeto chamado `filmes_ordenados`.
```{r}
filmes_ordenados <- arrange(imdb, ano, desc(receita))
filmes_ordenados
```
---
**2.** Selecione apenas as colunas `titulo` e `orcamento` e então ordene de forma decrescente pelo `orcamento`.
```{r, eval = FALSE}
# Aninhando as funções
arrange(select(imdb, titulo, orcamento), desc(orcamento))
# Criando objeto intermediário
imdb_aux <- select(imdb, titulo, orcamento)
arrange(imdb_aux, desc(orcamento))
# Pipe s2
imdb %>%
select(titulo, orcamento) %>%
arrange(desc(orcamento))
```
### Filtrando linhas {-}
Utilize a base `imdb` nos exercícios a seguir.
**1.** Crie um objeto chamado `filmes_ingles` apenas com filmes que sejam apenas no idioma inglês (`English`).
```{r}
# Vendo categorias da variável cor
unique(imdb$idioma)
# Filtrando
filmes_ingles <- imdb %>% filter(idioma == "English")
```
---
**2.** Crie um objeto chamado `curtos_legais` com filmes de 90 minutos ou menos de duração e nota no imdb maior do que 8.5.
```{r}
curtos_legais <- imdb %>%
filter(duracao <= 90, nota_imdb > 8.5)
```
---
**3.** Retorne tabelas (`tibbles`) apenas com:
**a.** filmes de ação anteriores a 1950;
```{r}
library(stringr)
imdb %>%
filter(str_detect(generos, "Action"), ano < 1950)
```
**b.** filmes dirigidos por "Woody Allen" ou "Wes Anderson";
```{r}
imdb %>%
filter(direcao == "Woody Allen" | direcao == "Wes Anderson")
```
**c.** filmes do "Steven Spielberg" ordenados de forma decrescente por ano, mostrando apenas as colunas `titulo` e `ano`;
```{r}
imdb %>%
filter(direcao == "Steven Spielberg") %>%
arrange(desc(ano)) %>%
select(titulo, ano)
```
**d.** filmes que tenham "Action" **ou** "Comedy" entre os seus gêneros;
```{r}
library(stringr)
# Solução 1
imdb %>%
filter(str_detect(generos, "Action") | str_detect(generos, "Comedy"))
```
**e.** filmes que tenham "Action" **e** "Comedy" entre os seus gêneros e tenha `nota_imdb` maior que 8;
```{r}
imdb %>%
filter(str_detect(generos, "Action"), str_detect(generos, "Comedy"), nota_imdb > 8)
```
**f.** filmes que não possuem informação tanto de receita quanto de orçamento (isto é, possuem `NA` em ambas as colunas).
```{r}
imdb %>%
filter(is.na(orcamento), is.na(receita))
```
### Modificando e criando novas colunas {-}
**1.** Crie uma coluna chamada `prejuizo` (`orcamento - receita`) e salve a nova tabela em um objeto chamado `imdb_prejuizo`. Em seguida, filtre apenas os filmes que deram prejuízo e ordene a tabela por ordem crescente de prejuízo.
```{r}
imdb_prejuizo <- imdb %>%
mutate(prejuizo = orcamento - receita)
imdb_prejuizo %>%
filter(prejuizo > 0) %>%
arrange(prejuizo)
```
---
**2.** Fazendo apenas uma chamada da função mutate(), crie as seguintes colunas novas na base `imdb`:
**a.** `lucro = receita - orcamento`
**b.** `lucro_medio`
**c.** `lucro_relativo = (lucro - lucro_medio)/lucro_medio`
**d.** `houve_lucro = ifelse(lucro > 0, "sim", "não")`
```{r}
imdb %>%
mutate(
lucro = receita - orcamento,
lucro_medio = mean(lucro, na.rm = TRUE),
lucro_relativo = (lucro - lucro_medio) / lucro_medio,
houve_lucro = ifelse(lucro > 0, "sim", "não")
)
```
---
**3.** Crie uma nova coluna que classifique o filme em `"recente"` (posterior a 2000) e `"antigo"` (de 2000 para trás).
```{r}
imdb %>%
mutate(antigo_ou_recente = ifelse(ano > 2000, "recente", "antigo"))
```
### Sumarizando a base {-}
Utilize a base `imdb` nos exercícios a seguir.
**1.** Calcule a duração média e mediana dos filmes
da base.
```{r}
imdb %>%
summarise(
duracao_media = mean(duracao, na.rm = TRUE),
duracao_mediana = median(duracao, na.rm = TRUE)
)
```
---
**2.** Calcule o lucro médio dos filmes com duração maior que 2 horas (ou seja, 120 minutos).
```{r}
imdb %>%
filter(duracao > 120) %>%
mutate(lucro = receita - orcamento) %>%
summarise(lucro_medio = mean(lucro, na.rm = TRUE))
```
---
**3.** Apresente na mesma tabela o lucro médio dos filmes com duracao menor que 120 minutos e o lucro médio dos filmes com duracao maior ou igual a 120 minutos.
```{r}
imdb %>%
mutate(
lucro = receita - orcamento,
duracao_cat = ifelse(duracao < 120, "menor 2h", "2h ou mais")
) %>%
filter(!is.na(lucro)) %>%
group_by(duracao_cat) %>%
summarise(
lucro_medio = mean(lucro, na.rm = TRUE)
)
```
---
**4.** Retorne tabelas (`tibbles`) apenas com:
**a.** a nota IMDB média dos filmes por ano de lançamento;
```{r}
imdb %>%
group_by(ano) %>%
summarise(nota_media = mean(nota_imdb, na.rm = TRUE))
```
**b.** a receita média e mediana dos filmes por ano;
```{r}
imdb %>%
filter(!is.na(receita)) %>%
group_by(ano) %>%
summarise(
receita_media = mean(receita, na.rm = TRUE),
receita_mediana = median(receita, na.rm = TRUE)
)
```
**c.** apenas o nome das pessoas que dirigiram mais de 10 filmes.
```{r}
imdb %>%
filter(!is.na(direcao)) %>%
group_by(direcao) %>%
summarise(num_filmes = n()) %>%
filter(num_filmes > 10) %>%
select(direcao)
```
*Também podemos usar a função `count()`.*
```{r}
imdb %>%
filter(!is.na(direcao)) %>%
count(direcao, name = "num_filmes") %>%
filter(num_filmes > 10) %>%
select(direcao)
```
### Juntando duas bases {-}
**1.** Utilize a base `imdb` para resolver os itens a seguir.
**a.** Salve em um novo objeto uma tabela com a
nota média dos filmes de cada pessoa que dirigiu filmes. Essa tabela
deve conter duas colunas (`direcao` e `nota_imdb_media`)
e cada linha deve ser um pessoa diferente.
```{r}
nota_direcao <- imdb %>%
group_by(direcao) %>%
summarise(nota_imdb_media = mean(nota_imdb))
nota_direcao
```
**b.** Use o `left_join()` para trazer a coluna
`nota_imdb_media` da tabela do item anterior
para a tabela `imdb` original.
```{r}
imdb %>%
left_join(nota_direcao, by = "direcao") %>%
select(nota_imdb_media, everything())
```