将 NaN 替换为 NA

Use*_*239 11 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))
Run Code Online (Sandbox Code Playgroud)

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

到目前为止我的方法:

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

我的代码的实际结果是:

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

Dav*_*man 21

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

上面的代码相当于

DT %>% mutate_all(function(x) ifelse(is.nan(x), NA, x))
Run Code Online (Sandbox Code Playgroud)

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

DT[, names(DT) := lapply(.SD, function(x) ifelse(is.nan(x), NA, x))]
Run Code Online (Sandbox Code Playgroud)

编辑:另一种方法可以做到这一点,如马库斯在下面的评论中发布的那样。

DT[, lapply(.SD, function(x) replace(x, is.nan(x), NA))]
Run Code Online (Sandbox Code Playgroud)