2016-11-25 69 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