R - 将nan转换为0导致所有0

时间:2017-09-26 15:59:25

标签: r nan na

我有一个包含NaN的数据框,我想将其转换为0' s。我写了一个我认为应该有效的函数:

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

有什么建议吗?

1 个答案:

答案 0 :(得分:5)

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

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