如何检查任何非有限的data.frame

SFu*_*n28 15 r

我想检查data.frame是否有任何非有限元素.

这似乎评估每一列,每个列返回FALSE(我猜测它将data.frame作为列表进行评估):

any( !is.finite( x ) )
Run Code Online (Sandbox Code Playgroud)

我不明白为什么这与上面的行为有所不同,但如果只是检查NA,它可以正常工作:

any( !is.na( x ) )
Run Code Online (Sandbox Code Playgroud)

我希望解决方案尽可能高效.我意识到我可以......

any( !is.finite( as.matrix( x ) ) )
Run Code Online (Sandbox Code Playgroud)

jor*_*ran 17

如果你打字,methods(is.na)你会发现它有一个data.frame方法,这可能解释了为什么它按你期望的方式工作,哪里is.finite没有.通常的解决方案是自己写一个,因为它只有一行.这样的事可能,

is.finite.data.frame <- function(obj){
    sapply(obj,FUN = function(x) all(is.finite(x)))
}
Run Code Online (Sandbox Code Playgroud)


JD *_*ong 7

我假设你得到的错误如下:

> any( is.infinite( z ) )
Error in is.infinite(z) : default method not implemented for type 'list'
Run Code Online (Sandbox Code Playgroud)

此错误是因为没有使用data.frames的方法实现is.infinite()is.finite()函数.该is.na()函数具有data.frame方法.

解决此问题的方法是对apply()data.frame中的每一行,每列或每个元素的函数.这是一个sapply()用于将is.infinite()函数应用于每个元素的示例:

x <- c(1:10, NA)
y <- c(1:11)
z <- data.frame(x,y)
any( sapply(z, is.infinite) )
 ## or

any( ! sapply(z, is.finite) )
Run Code Online (Sandbox Code Playgroud)