用NA替换NaN

时间:2019-01-09 21:11:55

标签: r data.table

假设以下数据表:

DT <- data.table(a=c(1,2,3,4,5,6),b=c(NaN,NaN,NaN,4,5,6),c=c(NaN,3,3,3,NaN,NaN))

如何将所有NaN的值替换为NA,即在每一列中?寻找一种优雅(简短)的方法来完成此操作,但我也想知道是否可以像我在下面尝试的那样使用lapply

到目前为止我的方法:

DT[,lapply(SD,function(x){x[is.nan(x)] := NA}),.SDcols=c("a","b","c")]  

我的代码的实际结果是:

  

:=(x [is.nan(x)],不适用)中的错误:     检查is.data.table(DT)== TRUE。否则,:=和:=(...)被定义为仅以特定方式在j中使用。请参阅help(“:=”)。

2 个答案:

答案 0 :(得分:1)

您想要这样的东西:

DT[DT == "NaN"] <- NA

理想情况下,这应该找到您拥有的所有NaN并将其替换为NA。如果有人知道更好的方法,请告诉我!

希望这会有所帮助!

答案 1 :(得分:1)

您可以使用dplyr的mutate_all函数轻松地做到这一点。

DT <- DT %>% mutate_all(~ifelse(is.nan(.), NA, .))
print(DT)
#a  b  c
# 1 NA NA
# 2 NA  3
# 3 NA  3
# 4  4  3
# 5  5 NA
# 6  6 NA

上面的代码等效于

DT %>% mutate_all(function(x) ifelse(is.nan(x), NA, x))

这是使用data.table语法完成此操作的一种方法。我不确定是否有更简单的方法。

DT[, names(DT) := lapply(.SD, function(x) ifelse(is.nan(x), NA, x))]

编辑:一种替代方法,如markus在注释beow中所张贴。

DT[, lapply(.SD, function(x) replace(x, is.nan(x), NA))]