web-dev-qa-db-fra.com

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

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
64
zxzak

Comme ça:

> df[df==""]<-NA
> df
     A    B
1 <NA>   12
2  xyz <NA>
3  jkl  100
94
mrip

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)
22
sedot

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.

3
skan

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'))
2
sbha

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
}
0
Olivier Ma