Ayant un cadre de données, comment puis-je remplacer toutes les valeurs particulières sur toutes les lignes et les colonnes. Disons par exemple que je veux remplacer tous les enregistrements vides par NA
'(sans taper les positions):
df <- data.frame(list(A=c("", "xyz", "jkl"), B=c(12, "", 100)))
A B
1 12
2 xyz
3 jkl 100
Résultat attendu:
A B
1 NA 12
2 xyz NA
3 jkl 100
Comme ça:
> df[df==""]<-NA
> df
A B
1 <NA> 12
2 xyz <NA>
3 jkl 100
Puisque PikkuKatja et Glallen ont demandé une solution plus générale et que je ne peux pas commenter, je vais écrire une réponse. Vous pouvez combiner des déclarations comme dans:
> df[df=="" | df==12] <- NA
> df
A B
1 <NA> <NA>
2 xyz <NA>
3 jkl 100
Pour les facteurs, le code de zxzak contient 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
Si vous avez des problèmes, je suggérerais de supprimer temporairement les facteurs.
df[] <- lapply(df, as.character)
Nous pouvons utiliser data.table pour l’obtenir rapidement ..___ d’abord 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 uniquement utiliser data.frame et conserver les facteurs, c'est plus difficile, vous devez travailler avec
levels(df$value)[levels(df$value)==""] <- NA
où valeur est le nom de chaque colonne. Vous devez l'insérer dans une boucle.
Voici quelques options dplyr
:
library(dplyr)
# all columns:
df %>%
mutate_all(~na_if(., ''))
# specific column types:
df %>%
mutate_if(is.factor, ~na_if(., ''))
# specific columns:
df %>%
mutate_at(vars(A, B), ~na_if(., ''))
# or:
df %>%
mutate(A = replace(A, A == '', NA))
# replace can be used if you want something other than NA:
df %>%
mutate(A = as.character(A)) %>%
mutate(A = replace(A, A == '', 'used to be empty'))
Si vous souhaitez remplacer plusieurs valeurs dans un cadre de données, il peut être utile de parcourir toutes les colonnes.
Supposons que vous souhaitiez remplacer ""
et 100
:
na_codes <- c(100, "")
for (i in seq_along(df)) {
df[[i]][df[[i]] %in% na_codes] <- NA
}