我想检查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)
我假设你得到的错误如下:
> 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)