R 用NA替换NAN

R 用NA替换NAN,r,data.table,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)) 我的代码的实际结果是: 中的错误:=(x[is.nan(x)],NA): 检查.data.table(DT)=TRUE。否则,:=和:=(…)被定义为只在j中使用一次,并以特定方式使用。请参阅帮助(“:=”) 你想要这样的东西: DT[DT == "NaN"] <- NA DT[DT==“NaN”]你想

假设以下数据表:

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))
我的代码的实际结果是:

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


你想要这样的东西:

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

DT[DT==“NaN”]你想要这样的东西:

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

DT[DT==“NaN”]您可以使用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
这里有一种使用data.table语法的方法。我不确定是否有更简单的方法

DT[, names(DT) := lapply(.SD, function(x) ifelse(is.nan(x), NA, x))]
编辑:另一种方法,由markus在下面的评论中发布

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

您可以使用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
这里有一种使用data.table语法的方法。我不确定是否有更简单的方法

DT[, names(DT) := lapply(.SD, function(x) ifelse(is.nan(x), NA, x))]
编辑:另一种方法,由markus在下面的评论中发布

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


谢谢,但我的NaN不是字符,因此您的代码无法工作:
[.data.table
(DT,DT==“NaN”)中出错:我是无效类型(矩阵)此外,NaN与任何值(包括其本身)都不等同于true。有关正确的测试,请参阅
is.NaN
。否则,您的想法是正确的。谢谢,但我的NaN不是字符,因此您的代码无法工作:错误在
[.data.table
(DT,DT==“NaN”):我是无效类型(矩阵)此外,NaN与任何值(包括其本身)都不等同于true。有关正确的测试,请参阅
is.NaN
。否则,您的想法是正确的。谢谢,但这不是
dplyr
语法吗?如果可能的话,我想坚持使用datatable进行一次操作。我使用data.table语法编辑了我的响应。I mostly使用dplyr,因此我不确定是否有比我发布的方式更简单的方法使用data.table。谢谢,这种新方法有效,但我也想在评论中指出markus的解决方案。我会接受你的努力,因为它有效。@DavidRosenman使用
set
的优点是它可以进行替换h您的解决方案您需要执行
DT谢谢,但这不是
dplyr
语法吗?如果可能的话,我希望只执行一次操作就坚持使用datatable。我编辑了我的回复,使用data.table语法。我主要使用dplyr,所以我不确定是否有比我发布的方式更简单的方法使用data.table。谢谢,这是新的这种方法是有效的,但我也想在评论中指出markus的解决方案。我会接受你的努力,因为它是有效的。@DavidRosenman使用
set
的优点是它可以进行替换。使用你的解决方案,你需要做
DT参见马特·道尔的答案结尾:你需要
for(j in names(DT)){set(DT,也就是.nan(DT[[j]]),j,NA)}
@markus谢谢,就是这样。我以前没看过这篇文章,谢谢。需要使用一个很好的for循环来
set
似乎:)很高兴它能工作。
set
实际上非常快,所以不要被循环“蒙蔽”。请看马特道尔的答案:你需要
for(j in names(DT)){set(DT,它(is.nan(DT[[j]]),j,NA)}
@markus谢谢,就是这样。我以前没看过这篇文章,谢谢。需要使用一个好的for循环
set
似乎:)很高兴它能工作。
set
实际上非常快,所以不要被循环“蒙蔽”。