187 votes

Remplacer toutes les valeurs 0 par NA

J'ai un cadre de données avec quelques colonnes numériques. Certaines lignes ont une valeur de 0 qui doit être considérée comme nulle dans l'analyse statistique. Quel est le moyen le plus rapide de remplacer toutes les valeurs 0 par NULL dans R ?

1voto

Muhammet Coskun Points 371

Voici ma contribution pour ceux qui se débattent avec des ensembles de données comportant différents types de colonnes avec des valeurs multiples représentant des données manquantes.

dat <- data_frame(numA = c(1, 0, 3, 4),
             numB = c(NA, 2, 3, 4),
             strC = c("0", "1.2", "NA", "2.4"),
             strD = c("Yes", "Yes", "missing", "No"))

Disons que dans ces données, nous voulons remplacer 0 dans les colonnes numériques par NA ainsi que les valeurs "NA" et "manquantes" dans les valeurs de caractères/chaînes avec NA . Remarquez que "NA" dans strC est une valeur de type caractère, et non la valeur souhaitée. NA .

dat
# A tibble: 4 x 4
  numA   numB  strC  strD   
  <dbl>  <dbl> <chr> <chr>  
1     1     NA 0     Yes    
2     0      2 1.2   Yes    
3     3      3 'NA'  missing
4     4      4 2.4   No 

Tout d'abord, un cas évident, remarquez que lors de la conversion d'une colonne de caractères en valeurs numériques, toute valeur de chaîne non numérique est contrainte à NA .

as.numeric(dat$strC)
[1] 0.0 1.2  NA 2.4 

Réponse avec indexation :

dat[dat == "NA" | dat =="missing"] <- NA

Cependant, ne l'utilisez PAS pour le 0 car cela change les 0 numériques et les 0 caractères en NA . Cela s'explique par le fait que "0" == 0 renvoie à TRUE en R.

Méthode dplyr::na_if :

library(dplyr)

dat %>%
  lapply(na_if, y = "missing") %>%
  lapply(na_if, y = "NA") %>%
  lapply(na_if, y = 0) %>%  # DONT DO THIS! It converts string 0s to NA as well!
  data.frame()

Nous appliquons ici na_if à chaque colonne des données. Puisque na_if n'accepte pas de valeurs multiples à convertir en NA nous devons écrire plusieurs lignes de code pour chaque valeur à convertir en NA . Toutefois, la simple utilisation de cette fonction avec 0 convertit à la fois les chiffres et les caractères 0 dans NA . Nous devons faire autre chose !

Utilisation de la méthode mutate across avec la fonction na_if :

C'est ma solution préférée. Ici, nous vérifions le type de colonne et appliquons na_if si nécessaire. Le caractère 0 est intacte, tandis que toutes les valeurs souhaitées sont converties en NA .

dat %>%
  mutate(across(where(is.numeric), ~na_if(., 0))) %>%
  mutate(across(where(is.character), ~na_if(., "NA"))) %>%
  mutate(across(where(is.character), ~na_if(., "missing")))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA 0     Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No 

Enfin, nariar peut être utilisé

nariar est un paquet récent qui introduit une variété de replace_with_ fonctions.

library(naniar)

Remplacer toutes les valeurs "NA" et "manquantes" par les valeurs suivantes NA :

dat %>%
  replace_with_na_all(~.x %in% c("NA", "missing"))

mais si vous l'utilisez avec 0 il convertit toujours de manière erronée le caractère 0 en NA :

dat %>%
  replace_with_na_all(~.x %in% c(0, "NA", "missing"))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA NA    Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No
#strC's first element should not be NA here!

Nous devons donc spécifier le type de colonne en utilisant replace_with_na_if :

dat %>%
  replace_with_na_if(is.character, ~.x %in% c("NA", "missing")) %>%
  replace_with_na_if(is.numeric, ~.x %in% c(0))

# A tibble: 4 x 4
   numA  numB strC  strD 
  <dbl> <dbl> <chr> <chr>
1     1    NA 0     Yes  
2    NA     2 1.2   Yes  
3     3     3 NA    NA   
4     4     4 2.4   No

Nous avons atteint le résultat souhaité. J'espère que tout ceci est utile :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X