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.
Vous pouvez directement indexer les champs correspondant à un critère logique. Donc, vous pouvez simplement écrire:
df[is_empty(df)] = NA
Où 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).
Que diriez-vous juste:
df[apply(df, 2, function(x) x=="")] = NA
Cela fonctionne bien pour moi, au moins sur des exemples simples.