2017-09-26 110 views
0

我有一个数据帧包含NaN,我想将其转换为0。我写的,我认为应该工作的函数:R - 将nan转换为0结果全部为0

fix_nan <- function(x){ 
    return(x[is.nan(x)] <- 0) 
} 

然后我把它应用到数据帧:

train_e <- structure(list(pack_id = structure(1:10, .Label = c("1", "2", 
"4", "5", "7", "8", "9", "10", "11", "14"), class = "factor"), 
    item_1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0), item_2 = c(NaN, 
    NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN), item_3 = c(1.45225232891169, 
    0.613104472886409, NaN, 1.02450431651439, 0.735706794978741, 
    0.741937344729377, NaN, 0.83034830207343, 0.97650959186721, 
    0.750305594399894), item_4 = c(0.645137961373585, 0.615792803650477, 
    Inf, 0.752866415261568, 0.84901755126673, 0.646398200985872, 
    Inf, 0.786548355648346, 0.725113372622438, 0.709897990984761 
    ), item_5 = c(NaN, NaN, NaN, 0, 0, 0, NaN, NaN, 0, 0), item_6 = c(0.510825623765991, 
    0.510825623765991, NaN, 0.510825623765991, 0.510825623765991, 
    0.510825623765991, NaN, 0.510825623765991, 0.847297860387204, 
    0.510825623765991)), .Names = c("pack_id", "item_1", "item_2", 
"item_3", "item_4", "item_5", "item_6"), row.names = c(26155L, 
6236L, 6281L, 6014L, 6035L, 26217L, 5576L, 6316L, 5594L, 26244L 
), class = "data.frame") 
vtf1 <- c('item_1','item_2','item_3','item_4','item_5','item_6') 


train_e[,vtf1] <- as.data.frame(lapply(train_e[,vtf1], fix_nan)) 
head(train_e) 

我也得到全0:

> head(train_e) 
     pack_id item_1 item_2 item_3 item_4 item_5 item_6 
26155  1  0  0  0  0  0  0 
6236  2  0  0  0  0  0  0 
6281  4  0  0  0  0  0  0 
6014  5  0  0  0  0  0  0 
6035  7  0  0  0  0  0  0 
26217  8  0  0  0  0  0  0 

有什么建议?

回答

4

x[is.nan(x)] <- 0仅返回那些NaN(现在为零)的x的元素。要解决此问题,请更改您的功能:

fix_nan <- function(x){ 
    x[is.nan(x)] <- 0 
    x 
}