961 votes

Comment remplacer les valeurs NA par des zéros dans un cadre de données R ?

J'ai un cadre de données et certaines colonnes ont NA valeurs.

Comment puis-je remplacer ces NA des valeurs avec des zéros ?

16 votes

petite modification de stackoverflow.com/questions/7279089/ (que j'ai trouvé en cherchant "[r] remplacer NA par zéro") ...

36 votes

d[is.na(d)] <- 0

1152voto

aL3xa Points 10236

Voir mon commentaire dans la réponse de @gsk3. Un exemple simple :

> m <- matrix(sample(c(NA, 1:10), 100, replace = TRUE), 10)
> d <- as.data.frame(m)
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3 NA  3  7  6  6 10  6   5
2   9  8  9  5 10 NA  2  1  7   2
3   1  1  6  3  6 NA  1  4  1   6
4  NA  4 NA  7 10  2 NA  4  1   8
5   1  2  4 NA  2  6  2  6  7   4
6  NA  3 NA NA 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10  NA
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5 NA  9  7  2  5   5

> d[is.na(d)] <- 0

> d
   V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
1   4  3  0  3  7  6  6 10  6   5
2   9  8  9  5 10  0  2  1  7   2
3   1  1  6  3  6  0  1  4  1   6
4   0  4  0  7 10  2  0  4  1   8
5   1  2  4  0  2  6  2  6  7   4
6   0  3  0  0 10  2  1 10  8   4
7   4  4  9 10  9  8  9  4 10   0
8   5  8  3  2  1  4  5  9  4   7
9   3  9 10  1  9  9 10  5  3   3
10  4  2  2  5  0  9  7  2  5   5

Il n'est pas nécessaire de postuler apply . =)

EDIT

Vous devriez également jeter un coup d'œil à norm paquet. Il possède de nombreuses fonctionnalités intéressantes pour l'analyse des données manquantes. =)

3 votes

J'ai déjà essayé ce code hier avant que vous le postiez et ça n'a pas marché. Parce que cela j'ai posté la question. Mais j'ai essayé de savoir et a travaillé parfaitement. Je pense que je faisais quelque chose de mal.

15 votes

@RenatoDinhaniConceição : si vous avez déjà essayé quelque chose, il est utile de partager cette information lorsque vous posez la question ; cela permet de préciser où se situe le problème.

2 votes

d[is.na(d)] <- 0 n'a pas de sens pour moi. Cela semble inversé ? Comment R traite-t-il cette déclaration ?

160voto

Ari B. Friedman Points 24940

Pour un seul vecteur :

x <- c(1,2,NA,4,5)
x[is.na(x)] <- 0

Pour un data.frame, créez une fonction à partir de ce qui précède, puis apply dans les colonnes.

Veuillez fournir un exemple reproductible la prochaine fois, comme indiqué ici :

Comment faire un excellent exemple reproductible en R ?

19 votes

is.na est une fonction générique, et possède des méthodes pour les objets de la catégorie data.frame donc celui-ci fonctionnera également sur data.frame s !

3 votes

Quand j'ai couru methods(is.na) pour la première fois, j'étais comme whaaa ?!? . J'adore quand des trucs comme ça arrivent ! =)

10 votes

Supposons que vous avez un cadre de données nommé df au lieu d'un vecteur unique et que vous voulez juste remplacer les observations manquantes dans une seule colonne nommée X3. Vous pouvez le faire avec cette ligne : df$X3[is.na(df$X3)] <- 0

95voto

ianmunoz Points 31

Exemple de dplyr :

library(dplyr)

df1 <- df1 %>%
    mutate(myCol1 = if_else(is.na(myCol1), 0, myCol1))

Note : Cela fonctionne par colonne sélectionnée, si nous avons besoin de le faire pour toutes les colonnes, voir @reidjax Réponse de l'entreprise en utilisant muté_chaque .

69voto

mrsoltys Points 145

Si nous essayons de remplacer NA lors de l'exportation, par exemple lors de l'écriture vers csv, alors nous pouvons utiliser :

  write.csv(data, "data.csv", na = "0")

0 votes

Dope...........

6voto

Zahra Points 11

Vous pouvez utiliser replace()

Par exemple :

> x <- c(-1,0,1,0,NA,0,1,1)
> x1 <- replace(x,5,1)
> x1
[1] -1  0  1  0  1  0  1  1

> x1 <- replace(x,5,mean(x,na.rm=T))
> x1
[1] -1.00  0.00  1.00  0.00  0.29  0.00 1.00  1.00

6 votes

Vrai, mais seulement pratique quand vous connaissez l'indice de NA dans votre vecteur. C'est très bien pour les petits vecteurs comme dans votre exemple.

5 votes

@dardisco x1 <- replace(x,is.na(x),1) fonctionnera sans énumérer explicitement les valeurs d'index.

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