Replace NULL in data frame

I have the following data framework:

  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 it with NULLthe actual 0. However, execution df.m[is.null(df.m)] <- 0does not change anything in the data frame.

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 with 0
df.m[is.null(df.m)] <- 0
+4
source share
2 answers

Cannot be used lapply. Use instead sapply. This will result in NAinstead NULL. Then you can:

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

Explanation:

lapplyreturns a list instead of a vector. In lists you can have null values. sapplyreturns the same values ​​as a vector, but with NAinstead of NULLs.

+8
source

lapply, a list, , , str(df.m).

, base R. unique vector ('lvls'), factor, levels "lvls", (table) (prop.table), cbind round .

lvls <- sort(union(unique(df.a), unique(df.b)))
round(cbind(prop.table(table(factor(df.a, levels = lvls))), 
                  prop.table(table(factor(df.b, levels = lvls)))), 3)
#  [,1]  [,2]
#1 0.000 0.056
#2 0.030 0.056
#3 0.061 0.167
#4 0.303 0.111
#5 0.394 0.111
#6 0.121 0.389
#7 0.091 0.111
+1

Source: https://habr.com/ru/post/1661935/


All Articles