有没有一种方法可以找到Inf/-Inf值?

16

我正在尝试在一个比较大的数据集上(5000x300)运行randomForest。不幸的是,我遇到了以下错误信息:

> RF <- randomForest(prePrior1, postPrior1[,6]
+                    ,,do.trace=TRUE,importance=TRUE,ntree=100,,forest=TRUE)
Error in randomForest.default(prePrior1, postPrior1[, 6], , do.trace = TRUE,  : 
  NA/NaN/Inf in foreign function call (arg 1)

所以我尝试使用以下方法查找任何NA值:

> df2 <- prePrior1[is.na(prePrior1)]
> df2 
character(0)
> df2 <- postPrior1[is.na(postPrior1[,6])]
> df2 
numeric(0)

这让我相信问题出在Inf上,因为似乎没有NA。

有没有关于如何排除Inf的建议?


它不必是Inf。正如错误所说,它也可以是NaN。无论如何,?Inf都可以回答你的问题。 - Joshua Ulrich
5个回答

28

你可能正在寻找is.finite,不过我不能确定问题是输入数据中的Infs。

请务必仔细阅读is.finite的帮助文档,了解它选择哪些缺失值、无限值等组合。特别是这一点:

> is.finite(c(1,NA,-Inf,NaN))
[1]  TRUE FALSE FALSE FALSE
> is.infinite(c(1,NA,-Inf,NaN))
[1] FALSE FALSE  TRUE FALSE

这些东西中有一件与其他不同。毫不奇怪,也有一个is.nan函数。


3
一般来说,randomForest警告关于NA/NaN/Inf并不是由NA/NaN/Inf引起的,事实上是由字符数据引起的。 - smci

12

随机森林的 'NA/NaN/Inf in foreign function call' 经常是一个虚假警告,真的很烦人:

  • 如果传递的任何变量是字符型,您将会看到这个警告
  • 实际上,在干净的数据中几乎从不会发生NaN和Inf

我的快速而简单的技巧是,对您的变量列表进行二分搜索,并使用诸如ntree=2之类的标记参数,以在变量子集上获得即时的通过/失败:

RF <- randomForest(prePrior1[m:n],ntree=2,...)

5

类比于is.na,您可以使用is.infinite来查找无穷大的出现。


2
乔兰的回答是您想要的并且富有信息性。关于is.na()is.infinite()的更多细节,您应该查看https://stat.ethz.ch/R-manual/R-devel/library/Matrix/html/is.na-methods.html。此外,在获得逻辑向量后,该向量显示原始向量的每个元素是否为NA/Inf,您可以使用which()函数来获取索引,就像这样:
> v1 <- c(1, Inf, 2, NaN, Inf, 3, NaN, Inf)
> is.infinite(v1)
[1] FALSE  TRUE FALSE FALSE  TRUE FALSE FALSE  TRUE
> which(is.infinite(v1))
[1] 2 5 8
> is.na(v1)
[1] FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
> which(is.na(v1))
[1] 4 7

which()函数的文档在这里:https://stat.ethz.ch/R-manual/R-devel/library/base/html/any.html


2

看一下 with,例如:

> with(df, df == Inf)
        foo   bar   baz   abc ...
[1,]  FALSE FALSE  TRUE FALSE ...
[2,]  FALSE  TRUE FALSE FALSE ...
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接