113 votes

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

En ayant un data frame, comment puis-je remplacer toutes les valeurs particulières le long de toutes les lignes et colonnes. Par exemple, si je veux remplacer tous les enregistrements vides par des 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

169voto

mrip Points 5688

Comme ceci :

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

39voto

sedot Points 536

Comme 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 suit :

> df[df=="" | df==12] <- NA
> df
     A    B
1   
2  xyz  
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 vous suggère de temporairement supprimer les facteurs.

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

31voto

sbha Points 1948

Voici quelques options dplyr :

library(dplyr)

# toutes les colonnes:
df %>% 
  mutate_all(~na_if(., ''))

# types de colonnes spécifiques:
df %>% 
  mutate_if(is.factor, ~na_if(., ''))

# colonnes spécifiques:  
df %>% 
  mutate_at(vars(A, B), ~na_if(., ''))

# ou:
df %>% 
  mutate(A = replace(A, A == '', NA))

# replace peut être utilisé si vous voulez autre chose que NA:
df %>% 
  mutate(A = as.character(A)) %>% 
  mutate(A = replace(A, A == '', 'était vide auparavant'))

5voto

skan Points 690

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)

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 convertir à nouveau en data.frame

setDF(df)

Si vous voulez seulement utiliser data.frame et conserver les facteurs, c'est plus difficile, 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.

1voto

Olivier Ma Points 633

Si vous voulez remplacer plusieurs valeurs dans un cadre de données, parcourir toutes les colonnes pourrait vous aider.

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
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X