Ayant un bloc de données, comment puis-je 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 des NA
's (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
df[df=="xyz"]<-"abc"
l'erreur avec "niveau de facteur non valide". Existe-t-il une solution plus générale?Puisque PikkuKatja et glallen ont demandé une solution plus générale et que je ne peux pas encore commenter, j'écrirai une réponse. Vous pouvez combiner des instructions 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 donne 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érerais de supprimer temporairement les facteurs.
la source
Voici quelques
dplyr
options: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'))
la source
Nous pouvons utiliser data.table pour l'obtenir rapidement. Créez d'abord df sans facteurs,
df <- data.frame(list(A=c("","xyz","jkl"), B=c(12,"",100)), stringsAsFactors=F)
Vous pouvez maintenant 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
Si vous souhaitez 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.
la source
Si vous souhaitez remplacer plusieurs valeurs dans un bloc de données, une boucle sur toutes les colonnes peut être utile.
Dites que vous souhaitez remplacer
""
et100
:na_codes <- c(100, "") for (i in seq_along(df)) { df[[i]][df[[i]] %in% na_codes] <- NA }
la source