sesselastronaut sesselastronaut - 9 days ago 9
R Question

Replace NULL in a dataframe

I've the following dataframe:

freq.a freq.b
1 NULL 0.055
2 0.030 0.055
3 0.060 0.161
4 0.303 0.111
5 0.393 0.111
6 0.121 0.388
7 0.090 0.111


And I would like to replace the
NULL
with an actual 0. However executing
df.m[is.null(df.m)] <- 0
doesn't change anything in the dataframe.

MWE as follows(sorry for the length):

library(plyr)
df.a <- c(5, 4, 5, 7, 3, 5, 6, 5, 5, 4, 5, 5, 4, 5, 4, 7, 2, 4, 4, 5, 3, 6, 5, 6, 4, 4, 5, 4, 5, 5, 6, 7, 4)
df.b <- c(1, 3, 4, 6, 2, 7, 7, 4, 3, 6, 6, 3, 6, 6, 5, 6, 6, 5)
df.a.count <- count(df.a)
df.b.count <- count(df.b)

#normalize the data
df.a.count$freq <- lapply(df.a.count$freq, function(X) X/length(df.a))
df.b.count$freq <- lapply(df.b.count$freq, function(X) X/length(df.b))
df.m <- merge(df.a.count, df.b.count, by ='x', all=TRUE)[2:3]
names(df.m) <- c('freq.a', 'freq.b')

#replace the NULL's with 0
df.m[is.null(df.m)] <- 0

Answer

You shouldn't use lapply. Use sapply instead. This will produce a NA instead of NULL. You can then do:

df.m[is.na(df.m)] <- 0

Explanation:

lapply returns a list instead of a vector. In lists you can have NULL values. sapply returns the same values in form of a vector, but with NAs instead of NULLs.

Comments