web-dev-qa-db-fra.com

Fonction pour remplacer Null par NA

J'essaie d'écrire une fonction qui transforme les valeurs nulles en NA. Un résumé d'une de mes colonnes ressemble à ceci:

      a   b 
 12 210 468 

Je voudrais changer les 12 valeurs vides à NA. J'ai également quelques autres colonnes de facteurs pour lesquelles j'aimerais modifier les valeurs Null en NA; j'ai donc emprunté des éléments ici et là pour en arriver à ceci:

# change nulls to NAs
nullToNA <- function(df){

  # split df into numeric & non-numeric functions
  a<-df[,sapply(df, is.numeric), drop = FALSE]
  b<-df[,sapply(df, Negate(is.numeric)), drop = FALSE]

  # Change empty strings to NA
  b<-b[lapply(b,function(x) levels(x) <- c(levels(x), NA) ),] # add NA level
  b<-b[lapply(b,function(x) x[x=="",]<- NA),]                 # change Null to NA

  # Put the columns back together
  d<-cbind(a,b)
  d[, names(df)]
}

Cependant, je reçois cette erreur:

> foo<-nullToNA(bar)  
Error in x[x == "", ] <- NA : incorrect number of subscripts on matrix  
Called from: FUN(X[[i]], ...)

J'ai essayé la réponse trouvée ici: Remplacez toutes les valeurs 0 par NA mais toutes mes colonnes sont remplacées par des valeurs numériques.

6
Travis Heeter

Vous pouvez directement indexer les champs correspondant à un critère logique. Donc, vous pouvez simplement écrire:

df[is_empty(df)] = NA

is_empty est votre comparaison, par exemple df == "":

df[df == ""] = NA

Mais notez que is.null(df) ne fonctionnera pas et serait de toute façon bizarre1. Je vous déconseille toutefois de fusionner la logique pour des colonnes de types différents! Au lieu de cela, manipulez-les séparément.


1 Vous ne rencontrerez presque jamais NULL dans une table car cela ne fonctionne que si le vecteur sous-jacent est un list. Vous pouvez créer des matrices et des data.frames avec cette contrainte, mais alors is.null(df) ne sera jamais TRUE car les valeurs NULL sont encapsulées dans la liste).

9
Konrad Rudolph

Que diriez-vous juste:

df[apply(df, 2, function(x) x=="")] = NA

Cela fonctionne bien pour moi, au moins sur des exemples simples.

1
juod