对于R中的数据帧,is.finite()的意外结果

时间:2011-10-12 01:48:42

标签: r

我已经将is.finite()用于向量,矩阵等,并且效果很好。令我困惑的是为什么它似乎为数据框和列表返回FALSE

例如,以下示例:

m <- matrix(0, 3, 3)
d <- as.data.frame(m)

is.finite(m)
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

is.finite(d)
   V1    V2    V3 
FALSE FALSE FALSE 

相当自然地,它对列表具有相同的行为。

我可以理解函数是否不适用于特定类型的对象(例如数据帧)。除了琐碎的情况(“一个停止的时钟是一天两次” - >一个具有非有限值的矩阵),我看不到is.finite()应该返回对数据框有意义的任何情况的情况或者一份清单。我希望错误而不是FALSE,否则在应用函数之前,它会强制将输入强制转换为矩阵。

问题:是否有某种方法可以以有意义的方式使用is.finite()数据框(和列表),或者是否有一些关于它的行为的信息比返回FALSE更有意义错误?


注1:顺便说一下,这是在文档中:

 All elements of types other than logical, integer, numeric and complex vectors
 are false.  Complex numbers are finite if both the real and imaginary parts are.

所以,澄清一个问题:为什么要返回错误而不是错误?结果是必须在调用is.finite()之外添加类型检查。

注意2:只是为了解决使用案例:我正在考虑使用is.na()is.nan()is.infinite()来检查一些数字异常,并决定is.finite()做到这一点,直到我意识到它与is.na()数据帧的行为不同。这种差异是出乎意料的。


更新(2011-11-01):R 2.14.0已发布,其新闻档案报告:The default methods for is.finite(), is.infinite() and is.nan() now signal an error if their argument is not an atomic vector.谢谢,R-Core众神! (注意:Kohske早些时候报道过这种情况,正如开发版中所述。新闻是现在它现在是发布版本。)

2 个答案:

答案 0 :(得分:3)

您正在将一个列表向量传递给一个函数,该函数被记录为使用逻辑,整数,数字和复杂元素的向量传递预期结果,并返回FALSE和其他任何内容。你应该做这样的事情:

> sapply( d, is.finite)
       V1   V2   V3
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

(顺便说一句:数据帧只是具有额外属性的列表。)

将结果与is.nan的行为方式进行比较可能会有所帮助。 is.nanis.finite都是元素方面的功能。另请参阅模式测试(不是is.finiteis.nan测试)提供的测试方法。这些为is.characteris.numericis.logical提供了列表式结果。

> sapply(d, is.character)
   V1    V2    V3 
FALSE FALSE FALSE 

答案 1 :(得分:1)

我真的不知道为什么它不会返回错误。很遗憾,is.finite(as.numeric(d))会返回错误(Error: (list) object cannot be coerced to type 'double')。所以,我唯一想到的就是遍历列(这些列可以与is.finite()一起正常工作),如下所示:

df.is.finite=function(d)
{
  for (i in 1:ncol(d))
  {
    if(!(all(is.finite(d[,i]))))
    {
      return(FALSE)
    }
  }
  return(TRUE)
}

如果你想使用这样的东西,你可能想要添加一些输入检查以确保输入是数据帧等等。此外,这个函数只返回一个布尔值。如果您希望它返回相应布尔值的数据框,则可以随意调整。