我已经将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早些时候报道过这种情况,正如开发版中所述。新闻是现在它现在是发布版本。)
答案 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.nan
和is.finite
都是元素方面的功能。另请参阅模式测试(不是is.finite
或is.nan
测试)提供的测试方法。这些为is.character
,is.numeric
和is.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)
}
如果你想使用这样的东西,你可能想要添加一些输入检查以确保输入是数据帧等等。此外,这个函数只返回一个布尔值。如果您希望它返回相应布尔值的数据框,则可以随意调整。