Usos das funções case_when e ifelse

Olá pessoal, tudo bem com vocês?

Eu estou fazendo uma alteração numa coluna da base de dados, substituir alguns valores por outros usando o case_when ou o ifelse, mas eles não atribuem a alteração para todas as linhas, são 162.000 linhas.

new_data ← mediana_select%>% mutate(fields2 = case_when(
grade_name == “Infantil 1 Ano” & fields == “MATEMÁTICA”|
fields == “LINGUAGENS”~“NA”,
grade_name == “Infantil 2 Anos” & fields == “MATEMÁTICA”|
fields == “LINGUAGENS”~“NA”,
grade_name == “Infantil 3 Anos” & fields == “MATEMÁTICA”|
fields == “LINGUAGENS”~“NA”,
grade_name == “Infantil 4 Anos” & fields == “MATEMÁTICA”|
fields == “LINGUAGENS”~“NA”,
grade_name == “Infantil 5 Anos” & fields == “MATEMÁTICA”|
fields == “LINGUAGENS”~“NA”, TRUE ~ as.character(fields)
))

teste ← mediana_select %>%
mutate(fields3 = ifelse(grade_name == “Infantil 1 Anos” &
fields == “MATEMÁTICA” | fields == “LINGUAGENS”, “NA”, fields),
ifelse(grade_name == “Infantil 2 Anos” &
fields == “MATEMÁTICA” | fields == “LINGUAGENS”, “NA”, fields),
ifelse(grade_name == “Infantil 3 Anos” &
fields == “MATEMÁTICA” | fields == “LINGUAGENS”, “NA”, fields),
ifelse(grade_name == “Infantil 4 Anos” &
fields == “MATEMÁTICA” | fields == “LINGUAGENS”, “NA”, fields),
ifelse(grade_name == “Infantil 5 Anos” &
fields == “MATEMÁTICA” | fields == “LINGUAGENS”, “NA”, fields)
)

Fabio,

Eu vou tentar ajudar, mas é complicado de imaginar o que está acontecendo sem ver os dados. Recomendo dar uma olhada nas nossas dicas para escrever perguntas :slight_smile:

Vendo o seu código, eu imagino que você queira atribuir NA para grade_name 1 ano caso fields seja matemática ou linguagens; o mesmo para todos os outros grade_name. Isso quer dizer que o seu teste lógico deve ser 1 ano & (mat | ling); do jeito como está, o teste ficou (1 ano & mat) | ling.

library(magrittr)

mediana_select <- tibble::tribble(
  ~grade_name, ~fields,
  "Infantil 1 Ano", "MATEMÁTICA",
  "Infantil 2 Anos", "LINGUAGENS",
  "Infantil 3 Anos", "MATEMÁTICA",
  "Infantil 4 Anos", "LINGUAGENS",
  "Infantil 5 Anos", "MATEMÁTICA",
  "Infantil 1 Ano", "COMPUTAÇÃO",
  "Infantil 6 Anos", "COMPUTAÇÃO",
  "Infantil 6 Anos", "LINGUAGENS",
  "Infantil 6 Anos", "MATEMÁTICA",
)

mediana_select %>%
  dplyr::mutate(
    fields2 = dplyr::case_when(
      grade_name == "Infantil 1 Ano"  & (fields == "MATEMÁTICA" | fields == "LINGUAGENS") ~ "NA",
      grade_name == "Infantil 2 Anos" & (fields == "MATEMÁTICA" | fields == "LINGUAGENS") ~ "NA",
      grade_name == "Infantil 3 Anos" & (fields == "MATEMÁTICA" | fields == "LINGUAGENS") ~ "NA",
      grade_name == "Infantil 4 Anos" & (fields == "MATEMÁTICA" | fields == "LINGUAGENS") ~ "NA",
      grade_name == "Infantil 5 Anos" & (fields == "MATEMÁTICA" | fields == "LINGUAGENS") ~ "NA",
      TRUE ~ as.character(fields)
    )
  )
#> # A tibble: 9 × 3
#>   grade_name      fields     fields2   
#>   <chr>           <chr>      <chr>     
#> 1 Infantil 1 Ano  MATEMÁTICA NA        
#> 2 Infantil 2 Anos LINGUAGENS NA        
#> 3 Infantil 3 Anos MATEMÁTICA NA        
#> 4 Infantil 4 Anos LINGUAGENS NA        
#> 5 Infantil 5 Anos MATEMÁTICA NA        
#> 6 Infantil 1 Ano  COMPUTAÇÃO COMPUTAÇÃO
#> 7 Infantil 6 Anos COMPUTAÇÃO COMPUTAÇÃO
#> 8 Infantil 6 Anos LINGUAGENS LINGUAGENS
#> 9 Infantil 6 Anos MATEMÁTICA MATEMÁTICA

Created on 2022-07-13 by the reprex package (v2.0.1)

Quanto ao seu segundo código, ele não funciona porque você está criando uma coluna só para o primeiro ifelse() e os outros estão sendo jogados para outras colunas sem nome.

P.S.: Eu não sei se você realmente queria fazer fields2 ser a string "NA" ou se você queria um NA de verdade. Se for o segundo, você precisa usar NA_character_.