Travis Heeter - 1 year ago 142
R Question

# Function to change Null to NA

I'm trying to write a function that turns Null values into NA. A summary of one of my column looks like this:

``````      a   b
12 210 468
``````

I'd like to change the 12 empty values to NA. I also have a few other factor columns for which I'd like to change Null values to NA, so I borrowed some stuff from here and there to come up with this:

``````# 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)]
}
``````

However, I'm getting this error:

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

I have tried the answer found here: Replace all 0 values to NA but it changes all my columns to numeric values.

``````df[is_empty(df)] = NA
Where `is_empty` is your comparison, e.g. `df == ""` (but note that `is.null(df)` won’t work, and would be weird anyway1). I would advise against merging the logic for columns of different types, though! Instead, handle them separately.
1 You’ll almost never encounter `NULL` inside a table since that only works if the underlying vector is a `list`. You can create matrices and data.frames with this constraint, but then `is.null(df)` will never be `TRUE` because the `NULL` values are wrapped inside the list).