Oi gente! Hoje na live eu mostrei a forma que eu pensei para resolver. Lembrando que tem muitas formas de resolver
Eu quebrei o problema em problemas menores e juntei no final, assim fica mais fácil de trabalhar. Esse é o código que mostrei na live. Na live fui explicando linha por linha!
# importar a base
imdb <- readr::read_rds("https://github.com/curso-r/blog/raw/main/static/data/desafios/imdb.rds")
# transformar a base para o formato longo
imdb_longo <- imdb |>
dplyr::mutate(lucro = receita - orcamento) |>
tidyr::pivot_longer(
cols = tidyselect::starts_with("ator_"),
names_to = "ordem_protagonismo",
values_to = "ator_atriz"
)
dplyr::glimpse(imdb_longo)
#> Rows: 11,421
#> Columns: 15
#> $ titulo <chr> "Avatar ", "Avatar ", "Avatar ", "Pirates of the Ca…
#> $ ano <int> 2009, 2009, 2009, 2007, 2007, 2007, 2012, 2012, 201…
#> $ diretor <chr> "James Cameron", "James Cameron", "James Cameron", …
#> $ duracao <int> 178, 178, 178, 169, 169, 169, 164, 164, 164, 132, 1…
#> $ cor <chr> "Color", "Color", "Color", "Color", "Color", "Color…
#> $ generos <chr> "Action|Adventure|Fantasy|Sci-Fi", "Action|Adventur…
#> $ pais <chr> "USA", "USA", "USA", "USA", "USA", "USA", "USA", "U…
#> $ classificacao <chr> "A partir de 13 anos", "A partir de 13 anos", "A pa…
#> $ orcamento <int> 237000000, 237000000, 237000000, 300000000, 3000000…
#> $ receita <int> 760505847, 760505847, 760505847, 309404152, 3094041…
#> $ nota_imdb <dbl> 7.9, 7.9, 7.9, 7.1, 7.1, 7.1, 8.5, 8.5, 8.5, 6.6, 6…
#> $ likes_facebook <int> 33000, 33000, 33000, 0, 0, 0, 164000, 164000, 16400…
#> $ lucro <int> 523505847, 523505847, 523505847, 9404152, 9404152, …
#> $ ordem_protagonismo <chr> "ator_1", "ator_2", "ator_3", "ator_1", "ator_2", "…
#> $ ator_atriz <chr> "CCH Pounder", "Joel David Moore", "Wes Studi", "Jo…
# Atores e atrizes, parcial
imdb_atores_parcial <- imdb_longo |>
tidyr::drop_na(ator_atriz, ano) |>
dplyr::group_by(ator_atriz) |>
dplyr::summarise(
nota_media_imdb = round(mean(nota_imdb, na.rm = TRUE), 1),
media_lucro = mean(lucro, na.rm = TRUE),
primeiro_registro = min(ano, na.rm = TRUE),
ultimo_registro = max(ano, na.rm = TRUE)
)
dplyr::glimpse(imdb_atores_parcial)
#> Rows: 4,590
#> Columns: 5
#> $ ator_atriz <chr> "50 Cent", "A. Michael Baldwin", "A.J. Buckley", "A.…
#> $ nota_media_imdb <dbl> 6.0, 6.5, 6.0, 4.5, 3.9, 5.7, 5.0, 6.5, 7.0, 7.5, 6.…
#> $ media_lucro <dbl> -7850379.8, 4282851.0, -4046244.3, NaN, -19691019.0,…
#> $ primeiro_registro <int> 2005, 1988, 2000, 2015, 1998, 2000, 2004, 2007, 2000…
#> $ ultimo_registro <int> 2015, 1988, 2015, 2015, 1998, 2002, 2004, 2007, 2002…
# base de filmes
filmes <- imdb_longo |>
dplyr::select(-ordem_protagonismo, -likes_facebook) |>
dplyr::relocate(nota_imdb, .after = classificacao) |>
dplyr::group_by(ator_atriz) |>
tidyr::nest() |>
dplyr::rename(filmes = data)
dplyr::glimpse(filmes)
#> Rows: 4,674
#> Columns: 2
#> Groups: ator_atriz [4,674]
#> $ ator_atriz <chr> "CCH Pounder", "Joel David Moore", "Wes Studi", "Johnny Dep…
#> $ filmes <list> [<tbl_df[7 x 12]>], [<tbl_df[7 x 12]>], [<tbl_df[6 x 12]>]…
# colunas top generos
classificacao <- imdb_longo |>
tidyr::separate_rows(generos, sep = "\\|") |>
dplyr::group_by(ator_atriz, generos) |>
dplyr::count() |>
dplyr::group_by(ator_atriz) |>
dplyr::arrange(ator_atriz, desc(n)) |>
dplyr::slice_head(n = 3) |>
dplyr::mutate(ordem = dplyr::row_number(),
ordem_nome = stringr::str_glue("top{ordem}_genero")) |>
tidyr::pivot_wider(
id_cols = ator_atriz,
names_from = ordem_nome,
values_from = generos
)
dplyr::glimpse(classificacao)
#> Rows: 4,674
#> Columns: 4
#> Groups: ator_atriz [4,674]
#> $ ator_atriz <chr> "50 Cent", "A. Michael Baldwin", "A.J. Buckley", "A.J. DeL…
#> $ top1_genero <chr> "Action", "Action", "Drama", "Action", "Comedy", "Action",…
#> $ top2_genero <chr> "Crime", "Fantasy", "Thriller", "Sci-Fi", "Family", "Crime…
#> $ top3_genero <chr> "Drama", "Horror", "Adventure", "Thriller", NA, "Drama", "…
# coluna contracenou
imdb_longo_filme_elenco <- imdb_longo |>
dplyr::select(ator_atriz, titulo)
contracenou <- imdb_longo_filme_elenco |>
dplyr::inner_join(imdb_longo_filme_elenco, by = "titulo") |>
dplyr::filter(ator_atriz.x != ator_atriz.y) |>
dplyr::rename(ator_atriz = ator_atriz.x) |>
dplyr::group_by(ator_atriz) |>
dplyr::summarise(
contracenou = knitr::combine_words(unique(ator_atriz.y), and = " e ", oxford_comma = FALSE)
)
dplyr::glimpse(contracenou)
#> Rows: 4,670
#> Columns: 2
#> $ ator_atriz <chr> "50 Cent", "A. Michael Baldwin", "A.J. Buckley", "A.J. DeL…
#> $ contracenou <xfn_rw_s> "Sylvester Stallone, Matt Gerald, Robert De Niro, Al …
# base final - dando joins
imdb_atores <- imdb_atores_parcial |>
dplyr::left_join(classificacao, by = "ator_atriz") |>
dplyr::left_join(filmes, by = "ator_atriz") |>
dplyr::left_join(contracenou, by = "ator_atriz") |>
dplyr::relocate(tidyselect::ends_with("genero"), .after = media_lucro)
# vendo o resultado final
dplyr::glimpse(imdb_atores)
#> Rows: 4,590
#> Columns: 10
#> $ ator_atriz <chr> "50 Cent", "A. Michael Baldwin", "A.J. Buckley", "A.…
#> $ nota_media_imdb <dbl> 6.0, 6.5, 6.0, 4.5, 3.9, 5.7, 5.0, 6.5, 7.0, 7.5, 6.…
#> $ media_lucro <dbl> -7850379.8, 4282851.0, -4046244.3, NaN, -19691019.0,…
#> $ top1_genero <chr> "Action", "Action", "Drama", "Action", "Comedy", "Ac…
#> $ top2_genero <chr> "Crime", "Fantasy", "Thriller", "Sci-Fi", "Family", …
#> $ top3_genero <chr> "Drama", "Horror", "Adventure", "Thriller", NA, "Dra…
#> $ primeiro_registro <int> 2005, 1988, 2000, 2015, 1998, 2000, 2004, 2007, 2000…
#> $ ultimo_registro <int> 2015, 1988, 2015, 2015, 1998, 2002, 2004, 2007, 2002…
#> $ filmes <list> [<tbl_df[5 x 12]>], [<tbl_df[1 x 12]>], [<tbl_df[5 …
#> $ contracenou <xfn_rw_s> "Sylvester Stallone, Matt Gerald, Robert De Nir…
dplyr::glimpse(imdb_atores$filmes[1])
#> List of 1
#> $ : tibble [5 × 12] (S3: tbl_df/tbl/data.frame)
#> ..$ titulo : chr [1:5] "Escape Plan " "Righteous Kill " "Get Rich or Die Tryin' " "Southpaw " ...
#> ..$ ano : int [1:5] 2013 2008 2005 2015 2014
#> ..$ diretor : chr [1:5] "Mikael Håfström" "Jon Avnet" "Jim Sheridan" "Antoine Fuqua" ...
#> ..$ duracao : int [1:5] 115 101 117 124 93
#> ..$ cor : chr [1:5] "Color" "Color" "Color" "Color" ...
#> ..$ generos : chr [1:5] "Action|Crime|Mystery|Sci-Fi|Thriller" "Action|Crime|Drama|Mystery|Thriller" "Biography|Crime|Drama|Music" "Drama|Sport" ...
#> ..$ pais : chr [1:5] "USA" "USA" "USA" "USA" ...
#> ..$ classificacao: chr [1:5] "A partir de 18 anos" "A partir de 18 anos" "A partir de 18 anos" "A partir de 18 anos" ...
#> ..$ nota_imdb : num [1:5] 6.7 6 5 7.5 4.6
#> ..$ orcamento : int [1:5] 50000000 60000000 40000000 30000000 18000000
#> ..$ receita : int [1:5] 25121291 40076438 30981850 52418902 NA
#> ..$ lucro : int [1:5] -24878709 -19923562 -9018150 22418902 NA
## Exemplo do combine_words()
vetor <- c("Bea", "Andressa", "Vitor", "Gabriel", "Daniel")
knitr::combine_words(vetor, and = " e ", oxford_comma = FALSE)
#> Bea, Andressa, Vitor, Gabriel e Daniel
Created on 2022-03-16 by the reprex package (v2.0.1)