Desafio #1: Manipulando a base de filmes do IMDB

Tópico reservado para postar resoluções do Desafio #1: Manipulando a base de filmes do IMDB

Oi, pessoal!

Esse é o primeiro desafio que postamos lá no blog da curso-r

O intuito desses desafios é mostrar como um problema prático na ciência de dados pode ter as mais diversas soluções!

Para isso, gostaríamos que você postasse a sua resolução aqui em nosso Discourse, assim, você estaria contribuindo com a variedade de soluções do problema, além de poder receber dicas da comunidade de como melhorar o seu código :slight_smile:

Então, vamos ao primeiro desafio!

2 curtidas

Olá pessoal!
Aqui vou demonstrar minha resolução parcial, visto que não consegui fazer a coluna contracenou (ainda!!!). Apesar de não ter finalizado, o motivo de colocar aqui é para me premiar, quem sabe eu animo de pensar em mais coisas para essa coluna contracenou.

# Bibliotecas utilizadas 
library(dplyr)
library(tidyr)
library(purrr)
library(stringr)
library(readr)

# Lendo os dados
dados <- read_rds("https://github.com/curso-r/blog/raw/main/static/data/desafios/imdb.rds")

# Essa função vai ajudar a decidir os top1, top2, top3 gêneros de cada ator.
# A ideia dela é utilizar um vetor com todos os gêneros concatenanos (por ator)
# e calcular a frequência de cada termo no vetor e retornar uma posição, que é
# definida pelo argumento `position`

pick_genero <- function(vec, position){
  
  table_split <- vec |> 
    str_split("[|]") |> 
    pluck(1) |> 
    table()
  
  if(length(names(table_split)) == 1){
    
    return(names(table_split))
    
  }
  
  valor <- table_split |> 
    sort(decreasing = TRUE) |>
    as_tibble(.name_repair = ~ c("value", "count")) |> 
    slice(position) |> 
    pull(value)
  
  if(tibble::is_tibble(valor)){
    
      return(NA)
    
  } else {
    
    return(valor)
    
  }
  
} 

# Aqui é a manipulação da base em si.
# 1. replace de NA 
# 2. pivotar os ator_1:ator_3 em uma coluna só
# 3. tirar colunas desnecessárias
# 4. calcular o lucro
# 5/6. agrupar por ator e "aninhar" todo o resto do dado em uma coluna `filmes`

dados |>
  replace_na(list(receita = 0, orcamento = 0, ano = 9999)) |> 
  pivot_longer(
    cols = ator_1:ator_3,
    names_to = "atores",
    values_to = "nome_ator") |> 
  select(-likes_facebook, -atores) |> 
  mutate(lucro = receita - orcamento) |> 
  group_by(nome_ator) |>
  nest(filmes = -nome_ator) |>
  summarise(
    nota_media_imdb  = pluck(filmes, 1, "nota_imdb") |> mean(na.rm = TRUE),
    media_lucro = pluck(filmes, 1, "lucro") |> mean(na.rm = TRUE),
    generos_combined = pluck(filmes, 1, "generos") |> reduce(~ str_c(..., sep = "|")),
    top1_genero = generos_combined |> pick_genero(1),
    top2_genero = generos_combined |> pick_genero(2),
    top3_genero = generos_combined |> pick_genero(3),
    primeiro_registro = pluck(filmes, 1, "ano") |> keep(~ .x != 9999) |> min(),
    ultimo_registro = pluck(filmes, 1, "ano") |> keep(~ .x != 9999) |> max()) |> 
 select(-generos_combined)

#> # A tibble: 3,813 × 8
#> # Groups:   nome_ator [3,813]
#>    nome_ator     nota_media_imdb media_lucro top1_genero top2_genero top3_genero
#>    <chr>                   <dbl>       <dbl> <chr>       <chr>       <chr>      
#>  1 50 Cent                  5.96   -9880304. Action      Crime       Drama      
#>  2 A. Michael B…            6.5     4282851  Action      Fantasy     Horror     
#>  3 A.J. Buckley             6.04   21986321  Drama       Thriller    Adventure  
#>  4 A.J. DeLucia             4.5      -75000  Action      Sci-Fi      Thriller   
#>  5 Aaliyah                  5.65   13140570  Action      Crime       Drama      
#>  6 Aaron Ashmore            5             0  Drama       Family      Music      
#>  7 Aaron Hill               7.5           0  Drama       Mystery     Thriller   
#>  8 Aaron Hughes             6.5    -1573149  Comedy      Crime       Romance    
#>  9 Aaron Stanfo…            7.23     264302. Drama       Action      Comedy     
#> 10 Aaron Yoo                6.45   21294197. Drama       Comedy      Romance    
#> # … with 3,803 more rows, and 2 more variables: primeiro_registro <dbl>,
#> #   ultimo_registro <dbl>
4 curtidas

Oi Douglas,
eu fiz essa parte assim por hora. To pensando em criar uma função para automatizar isso e usar map depois. O que acha?

   df_tidy <- imdb %>%
  replace_na(replace = list(duracao = 0,
                            ano = 0,
                            orcamento = 0,
                            receita = 0)) %>%
  pivot_longer(cols = starts_with("ator_"),
               names_to = "vars",values_to = "Ator") %>%
  select(-vars)

#Exemplo pra Robin Wright como atriz
vec <- df_tidy %>%
  filter(Ator == "Robin Wright") %>%
  select(titulo) %>%
  pull()

vec1 <- df_tidy %>%
  filter(titulo %in% vec) %>%
  filter(Ator != "Robin Wright") %>%
  distinct(Ator) %>%
  pull(Ator)

paste(vec1,collapse = ", ")
3 curtidas

E ai galera, beleza? Sou iniciante no R e na ciência de dados no geral e gostei muito da iniciativa!

Fiz minha versão iniciante do desafio, ficou bem limitado porque escolhi apenas um ator mas é o que consigo fazer por enquanto, o ator escolhido foi Johnny Depp. Aceito feedbacks e dicas!

imdb <- read_rds("https://github.com/curso-r/blog/raw/main/static/data/desafios/imdb.rds")

generos_table <- imdb %>% 
  select(ator_1, generos) %>% 
  filter(ator_1 == "Johnny Depp") %>% 
  pull() %>% 
  str_replace_all("[[|]]", " ") %>% 
  data.frame() %>%
  rename(generos = ".") %>% 
  separate(generos, into = c("1", "2", "3", "4", "5", "6"), sep = " ") %>%
  unlist() %>%
  table() %>% 
  sort(decreasing = TRUE) %>% 
  data.frame()

IMDB_atores <- imdb %>%
  rename(ator = ator_1) %>% 
  filter(ator == "Johnny Depp") %>% 
  na.omit() %>%
  mutate(
    nota_media_imdb = mean(nota_imdb),
    media_lucro = mean(receita - orcamento),
    top1_genero = generos_table$.[1],
    top2_genero = generos_table$.[2],
    top3_genero = generos_table$.[3],
    primeiro_registro = ano[which.min(ano)],
    ultimo_registro = ano[which.max(ano)]) %>% 
  select(ator, nota_media_imdb, media_lucro, 
         top1_genero, top2_genero, top3_genero, 
         primeiro_registro, ultimo_registro) %>% head(1)

A tabela dos filmes:

filmes <- imdb %>% 
  filter(ator_1 == "Johnny Depp") %>% 
  mutate(lucro = receita - orcamento) %>% 
  rename("nome do filme" = titulo,
         "ano do filme" = ano,
         "diretor(a) do filme" = diretor,
         "duração do filme" = duracao,
         "cor do filme (Color ou Black and White)" = cor,
         "generos do filme" = generos,
         "país do filme" = pais,
         "classificação etária do filme" = classificacao,
         "nota imbd do filme" = nota_imdb,
         "orcamento do filme" = orcamento, 
         "receita do filme" = receita) %>% 
  select(-likes_facebook, -ator_1, -ator_2, -ator_3)

A tabela dos atores que Johnny Depp contracenou:

contracenou <- filmes %>% 
  select(ator_2, ator_3) %>% 
  unite(ator_2, ator_3) %>% 
  unique() %>% pull()
3 curtidas

Pessoal, no começo da próxima live pretendemos falar da resolução deste desafio!

Quem ainda não postou a resolução, tentem postar até a live! (quarta, às 20h!)

E obrigada para quem respondeu com as suas resoluções!

3 curtidas

Oi gente! Hoje na live eu mostrei a forma que eu pensei para resolver. Lembrando que tem muitas formas de resolver :smiley:

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)

2 curtidas

Postando aqui a minha versão da solução! Meu objetivo foi atender aos requisitos com apenas uma pipeline e sem passar de 80 caracteres por linha. A grande estrela do código foi a função dplyr::cur_data().

# Ler tabela do site da Curso-R
"https://github.com/curso-r/blog/raw/main/static/data/desafios/imdb.rds" |>
  readr::read_rds() |>

  # Lucro é necessário algumas vezes, então é melhor calcular fora
  dplyr::mutate(lucro = receita - orcamento) |>

  # Antes de pivotar a tabela para a chave ser ator, guardar contracenas
  tidyr::unite("contracenou", dplyr::starts_with("ator"), remove = FALSE) |>

  # A chave tem que ser ator, então pivotar (e remover NAs)
  tidyr::pivot_longer(dplyr::starts_with("ator"), values_to = "ator") |>
  dplyr::filter(!is.na(ator)) |>

  # Agrupar e resumir por ator, assim cada linha é um ator
  dplyr::group_by(ator) |>
  dplyr::summarise(

    # Sumarizações simples (na.rm = FALSE por garantia)
    nota_media_imdb = mean(nota_imdb),
    media_lucro = mean(lucro),
    primeiro_registro = min(ano),
    ultimo_registro = max(ano),

    # Separar os gêneros, calcular frequências e criar tibble com o top 3
    top_genero = generos |>
      stringr::str_split("\\|") |>
      purrr::flatten_chr() |>
      table() |>
      sort(decreasing = TRUE) |>
      names() |>
      magrittr::extract(1:3) |>
      purrr::set_names(stringr::str_glue("top{1:3}_genero")) |>
      tibble::as_tibble_row() |>
      list(),

    # Separar os contracenas, remover repetidos e o próprio ator
    contracenou = contracenou |>
      stringr::str_split("_") |>
      purrr::flatten_chr() |>
      unique() |>
      purrr::discard(is.na) |>
      purrr::keep(~ .x != ator[1]) |>
      list(),

    # Guardar as colunas relevantes do grupo em uma list-column
    filmes = dplyr::cur_data() |>
      dplyr::select(titulo:nota_imdb, lucro) |>
      list()
  ) |>

  # Espalhar os gêneros mais frequêntes em colunas separadas
  tidyr::unnest_wider(top_genero) |>
  dplyr::glimpse()
#> Rows: 4,673
#> Columns: 10
#> $ ator              <chr> "50 Cent", "A. Michael Baldwin", "A.J. Buckley", "A.…
#> $ nota_media_imdb   <dbl> 5.960000, 6.500000, 6.040000, 4.500000, 3.900000, 5.…
#> $ media_lucro       <dbl> NA, 4282851, NA, NA, -19691019, 13140570, NA, NA, -1…
#> $ primeiro_registro <int> 2005, 1988, 2000, 2015, 1998, 2000, 2004, NA, 2007, …
#> $ ultimo_registro   <int> 2015, 1988, 2015, 2015, 1998, 2002, 2004, NA, 2007, …
#> $ 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…
#> $ contracenou       <list> <"Sylvester Stallone", "Matt Gerald", "Robert De Ni…
#> $ filmes            <list> [<tbl_df[5 x 12]>], [<tbl_df[1 x 12]>], [<tbl_df[5 …

Created on 2022-03-17 by the reprex package (v2.0.1)

3 curtidas

Olá a todos, aqui está a minha solução. Pelo que vi, fiz de uma forma bem diferente da maioria. Depois verei o vídeo da solução. Abraços e obrigada.

# Curso R -------------------------------------------------------------------------------------------------------------------------------
# Manipulando a base de filmes do IMDB --------------------------------------------------------------------------------------------------
# Desafio #1 ----------------------------------------------------------------------------------------------------------------------------
# Autoria do script: Jeanne Franco ------------------------------------------------------------------------------------------------------
# Data: 16/04/2022 ----------------------------------------------------------------------------------------------------------------------

# Pacote necessário ------------------------------------------------------------------------------------------------------------------------

library(tidyverse)

# Desafio:  --------------------------------------------------------------------------------------------------------------------------------

## Escreva um código que transforme a base do IMDB em uma base nomeada IMDB_atores, que deve ser 
## formada pelas seguintes colunas:

#### ator: nome de um(a) ator/atriz (cada nome deve aparecer uma vez só)

base <- readRDS("imdb.rds")
View(base)

base %>% 
  select(starts_with("ator")) %>% 
  head(3)

base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz"
  ) %>% 
  select(ator_atriz) %>%
  arrange(ator_atriz)

#### nota_media_imdb: nota imdb média dos filmes que o(a) ator/atriz participou

base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz"
  ) %>% 
  select(ator_atriz, nota_imdb) %>%
  group_by(ator_atriz) %>%
  summarise(nota_media_imdb = mean(nota_imdb, na.rm = TRUE)) %>%
  arrange(ator_atriz, nota_media_imdb)

#### media_lucro: lucro médio dos filmes que o(a) ator/atriz participou

base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz"
  ) %>% 
  select(ator_atriz, receita, orcamento) %>%
  mutate(lucro = receita - orcamento) %>%
  group_by(ator_atriz) %>%
  summarise(media_lucro = mean(lucro, na.rm = TRUE)) %>%
  arrange(ator_atriz, media_lucro)

#### top1_genero: gênero mais frequente entre os filmes que o(a) ator/atriz participou

generos <- base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz"
  ) %>% 
  select(ator_atriz, generos) %>%
    separate( 
    col = generos,
    into = c("genero1", "genero2", "genero3"), 
    sep = "\\|") 
view(generos)
tibble(generos)

generos$ator_atriz <- as.factor(generos$ator_atriz)
generos$genero1 <- as.factor(generos$genero1)
generos$genero2 <- as.factor(generos$genero2)
generos$genero3 <- as.factor(generos$genero3)

levels(generos$genero1)
levels(generos$genero2)
levels(generos$genero3)

top1_genero <- generos %>%
  select(ator_atriz, genero1) %>%
  group_by(ator_atriz, genero1) %>%
  summarise(Frequencia1 = n())
view(top1_genero)

#### top2_genero: segundo gênero mais frequente entre os filmes que o(a) ator/atriz participou

top2_genero <- generos %>%
  select(ator_atriz, genero2) %>%
  group_by(ator_atriz, genero2) %>%
  summarise(Frequencia2 = n())
view(top2_genero)

#### top3_genero: terceiro gênero mais frequente entre os filmes que o(a) ator/atriz particiou

top3_genero <- generos %>%
  select(ator_atriz, genero3) %>%
  group_by(ator_atriz, genero3) %>%
  summarise(Frequencia3 = n())
view(top3_genero)

#### primeiro_registro: ano do primeiro filme que o(a) ator/atriz participou

prim_reg <- base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz"
  ) %>% 
  select(ator_atriz, ano, titulo) %>%
  arrange(ator_atriz, ano, titulo)
view(prim_reg)

#### ultimo_registro: ano do último filme que o(a) ator/atriz particiou

ult_reg <- base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz"
  ) %>% 
  select(ator_atriz, ano, titulo) %>%
  arrange(ator_atriz, ano, titulo)
view(ult_reg)

#### filmes: um data frame com informações de todos os filmes que o(a) ator/atriz participou, 
#### as colunas desse data frame devem ser as seguintes:

# - título: nome do filme
# - ano: ano do filme
# - diretor: diretor(a) do filme
# - duracao: duração do filme
# - cor: cor do filme (Color ou Black and White)
# - generos: generos do filme
# - pais: país do filme
# - classificacao: classificação etária do filme
# - nota_imdb: nota imbd do filme
# - orcamento: orcamento do filme
# - receita: receita do filme
# - lucro: lucro do filme

filmes <- base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz") %>% 
  select(ator_atriz, titulo, ano, diretor, duracao, cor, generos, pais, 
         classificacao, nota_imdb, orcamento, receita) %>%
  mutate(lucro = receita - orcamento) %>%
  arrange(ator_atriz, titulo, ano, diretor, duracao, cor, generos, pais, 
         classificacao, nota_imdb, orcamento, receita, lucro)
view(filmes)

#### contracenou: um vetor com os nomes de todos os(as) atores/atrizes que o(a) ator/atriz já 
#### contracenou (ou seja, participou do mesmo filme)

contracenou <- base %>% 
  pivot_longer(
    cols = starts_with("ator"), 
    names_to = "protagonismo",
    values_to = "ator_atriz") %>% 
  select(ator_atriz, titulo) %>%
  arrange(titulo)
view(contracenou)


1 curtida