假设以下数据表:
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(“:=”)。
答案 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))]