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 ?
Réponse
Trop de publicités?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 :)
- Réponses précédentes
- Plus de réponses