web-dev-qa-db-fra.com

Remplacer les valeurs NA d'une colonne par 0 dans la trame de données R

Duplicata possible:
Réglez NA sur 0 dans R

J'ai un data.frame avec une colonne ayant NA valeurs. Je veux remplacer NA par 0 ou toute autre valeur. J'ai essayé beaucoup de threads et de méthodes mais cela ne m'a pas donné le résultat. J'ai essayé les méthodes ci-dessous.

a$x[a$x==NA]<-0;
a[,c("x")]<-apply(a[,c("x")],1,function(z){replace(z, is.na(z), 0)});
a$x[is.na(a$x),]<-0;

Aucune des méthodes ci-dessus n'a remplacé NA par 0 dans la colonne x pour data.frame a. Pourquoi?

26
Kunal Batra

Comme personne ne s'est senti à ce jour apte à souligner pourquoi ce que vous essayez ne fonctionne pas

  1. NA == NA Ne renvoie pas TRUE, il renvoie NA (car la comparaison avec des valeurs non définies devrait donner un résultat non défini).
  2. Vous essayez d'appeler apply sur un vecteur atomique. Vous ne pouvez pas utiliser apply pour parcourir les éléments d'une colonne.
  3. Vos indices sont désactivés - vous essayez de donner deux indices dans a$x, Qui est juste la colonne (un vecteur atomique).

Je réparerais 3. pour arriver à a$x[is.na(a$x)] <- 0

64
themel

Tout d'abord, voici quelques exemples de données:

set.seed(1)
dat <- data.frame(one = rnorm(15),
                 two = sample(LETTERS, 15),
                 three = rnorm(15),
                 four = runif(15))
dat <- data.frame(lapply(dat, function(x) { x[sample(15, 5)] <- NA; x }))
head(dat)
#          one  two       three      four
# 1         NA    M  0.80418951 0.8921983
# 2  0.1836433    O -0.05710677        NA
# 3 -0.8356286    L  0.50360797 0.3899895
# 4         NA    E          NA        NA
# 5  0.3295078    S          NA 0.9606180
# 6 -0.8204684 <NA> -1.28459935 0.4346595

Voici notre remplaçant:

dat[["four"]][is.na(dat[["four"]])] <- 0
head(dat)
#          one  two       three      four
# 1         NA    M  0.80418951 0.8921983
# 2  0.1836433    O -0.05710677 0.0000000
# 3 -0.8356286    L  0.50360797 0.3899895
# 4         NA    E          NA 0.0000000
# 5  0.3295078    S          NA 0.9606180
# 6 -0.8204684 <NA> -1.28459935 0.4346595

Alternativement, vous pouvez bien sûr écrire dat$four[is.na(dat$four)] <- 0

7