2016-11-25 74 views
3

替换NULL我有以下数据框:在数据帧

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 

而且我想用一个实际的0。但是执行df.m[is.null(df.m)] <- 0不改变数据帧的任何更换NULL。如下

MWE(遗憾的长度):

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 
+0

如果你看'str(df.m)',每一列都是一个'list'。 'lapply'返回一个'list',这就是原因。 – akrun

+0

尝试'应用(df.m,2,函数(y)sapply(y,函数(x)ifelse(is.null(x),0,x)))'' – count

回答

7

你不应该使用lapply。改为使用sapply。这将产生NA而不是NULL's。然后,你可以这样做:

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

说明:

lapply返回一个列表,而不是载体。在列表中你可以有NULL值。 sapply返回一个矢量的形式的相同的值,但NA s,而不是NULL秒。

1

原因是使用lapply,它返回list,可以很容易地发现查看数据集的结构,即str(df.m)

我们也可以做到这一点单独使用base R。获取所有从vector小号两种unique元素(“lvls”),通过指定levels为“lvls”,得到了频率计数(table)和比例(prop.table),cbind输出和round两个数据集转换为factor如有必要。

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