Remplacer toutes les valeurs particulières dans un bloc de données

Ayant un bloc de données, comment dois-je procéder pour remplacer toutes les valeurs particulières le long de toutes les lignes et colonnes. Disons par exemple que je veux remplacer tous les enregistrements vides par ceux de NA (sans saisir les positions):

 df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100))) AB 1 12 2 xyz 3 jkl 100 

Résultat attendu:

  AB 1 NA 12 2 xyz NA 3 jkl 100 

Comme ça:

 > df[df==""]<-NA > df AB 1  12 2 xyz  3 jkl 100 

Puisque PikkuKatja et Glallen ont demandé une solution plus générale et que je ne peux pas encore commenter, je vais écrire une réponse. Vous pouvez combiner des déclarations comme dans:

 > df[df=="" | df==12] <- NA > df AB 1   2 xyz  3 jkl 100 

Pour les facteurs, le code de zxzak fournit déjà des facteurs:

 > df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100))) > str(df) 'data.frame': 3 obs. of 2 variables: $ A: Factor w/ 3 levels "","jkl","xyz": 1 3 2 $ B: Factor w/ 3 levels "","100","12": 3 1 2 

En cas de problème, je suggère de laisser tomber temporairement les facteurs.

 df[] <- lapply(df, as.character) 

Nous pouvons utiliser data.table pour l’obtenir rapidement. Commencez par créer df sans facteurs,

 df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F) 

Maintenant, vous pouvez utiliser

 setDT(df) for (jj in 1:ncol(df)) set(df, i = which(df[[jj]]==""), j = jj, v = NA) 

et vous pouvez le reconvertir en data.frame

 setDF(df) 

Si vous voulez seulement utiliser data.frame et garder les facteurs plus difficiles, vous devez travailler avec

 levels(df$value)[levels(df$value)==""] <- NA 

où value est le nom de chaque colonne. Vous devez l'insérer dans une boucle.

Si vous souhaitez remplacer plusieurs valeurs dans un bloc de données, il peut être utile de parcourir toutes les colonnes.

Disons que vous voulez remplacer "" et 100 :

 na_codes <- c(100, "") for (i in seq_along(df)) { df[[i]][df[[i]] %in% na_codes] <- NA }