2013-04-02 68 views
16

我想尝试两件事情:删除NA/NaN的/ INF在矩阵

  1. 我如何删除包含NA/NaN的/ INF
  2. 行如何设置数据点的值从NA/NaN/Inf为0.

到目前为止,我已经尝试使用以下NA值,但一直在收到警告。

> eg <- data[rowSums(is.na(data)) == 0,] 
Error in rowSums(is.na(data)) : 
     'x' must be an array of at least two dimensions 
    In addition: Warning message: 
    In is.na(data) : is.na() applied to non-(list or vector) of type 'closure' 
+2

该警告是因为您尚未定义'data',这也是'utils'包中的一个函数。也就是说,你在函数上调用'is.na',这是没有意义的。 –

+0

分享到:相关文章:https://stackoverflow.com/questions/7518245/one-function-to-detect-nan-na-inf-inf-etc – zx8754

回答

12
library(functional) 
m[apply(m, 1, Compose(is.finite, all)),] 

演示:

m <- matrix(c(1,2,3,NA,4,5), 3) 
m 
##  [,1] [,2] 
## [1,] 1 NA 
## [2,] 2 4 
## [3,] 3 5 

m[apply(m, 1, Compose(is.finite, all)),] 
##  [,1] [,2] 
## [1,] 2 4 
## [2,] 3 5 

注:Compose(is.finite, all)相当于function(x) all(is.finite(x))

要设置的值为0,使用矩阵印出兴:

m[!is.finite(m)] <- 0 
m 
##  [,1] [,2] 
## [1,] 1 0 
## [2,] 2 4 
## [3,] 3 5 
+0

我仍然看到--Inf值 – user2199881

+0

这不适用于'Inf' 。你需要'is.finite'。 –

+0

哦,对不起,错过了Inf。 –

3

只是另一种方式(对于第一个问题):

m <- structure(c(1, 2, 3, NA, 4, 5, Inf, 5, 6, NaN, 7, 8), 
       .Dim = c(4L, 3L)) 
#  [,1] [,2] [,3] 
# [1,] 1 4 6 
# [2,] 2 5 NaN 
# [3,] 3 Inf 7 
# [4,] NA 5 8 

m[complete.cases(m * 0), , drop=FALSE] 
#  [,1] [,2] [,3] 
# [1,] 1 4 6 

我想不出别的比马修的回答第二部分其他。

31

我想我会扔我的帽子进入环与我的首选方法:

# sample data 
m <- matrix(c(1,2,NA,NaN,1,Inf,-1,1,9,3),5) 
# remove all rows with non-finite values 
m[!rowSums(!is.finite(m)),] 
# replace all non-finite values with 0 
m[!is.finite(m)] <- 0 
8

NaRV.omit(X)是我的问题1.助记符NARV首选的意思是“不是一个普通的值” 。

require(IDPmisc) 
m <- matrix(c(1,2,3,NA,5, NaN, 7, 8, 9, Inf, 11, 12, -Inf, 14, 15), 5) 
> m 
    [,1] [,2] [,3] 
[1,] 1 NaN 11 
[2,] 2 7 12 
[3,] 3 8 -Inf 
[4,] NA 9 14 
[5,] 5 Inf 15 
> NaRV.omit(m) 
    [,1] [,2] [,3] 
[1,] 2 7 12 
attr(,"na.action") 
[1] 1 3 4 5 
attr(,"class") 
[1] "omit"