2013-04-02 14 views
16

chcę spróbować dwóch rzeczy:Usuń NA/NaN/Inf w matrycy

  1. Jak mogę usunąć wiersze, które zawierają NA/NaN/Inf
  2. W jaki sposób ustawić wartość punktu danych z NA/NaN/Inf do 0.

Do tej pory próbowałem używać następujących wartości NA, ale otrzymywałem ostrzeżenia.

> 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

Ostrzeżenie jest takie, że nie zdefiniowano 'danych', które jest również funkcją w pakiecie' utils'. Np. Nazywasz 'is.na' funkcją, która nie ma sensu. –

+0

Powiązany post: https://stackoverflow.com/questions/7518245/one-function-to-detect-nan-na-inf-inf-etc – zx8754

Odpowiedz

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

Demonstracja:

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 

Uwaga: Compose(is.finite, all) odpowiada function(x) all(is.finite(x))

ustawienia wartości 0, inde zastosowanie matrycy Xing:

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

Ciągle widzę -Inf wartości – user2199881

+0

To nie zadziała dla 'Inf' . Potrzebujesz 'is.finite'. –

+0

Przepraszam, przegapiłem Inf. –

3

tylko inny sposób (na pierwsze pytanie):

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 

nie mogę nic innego niż odpowiedź Mateusza do drugiej części myśleć.

31

Chyba rzucę mój kapelusz na ring z moich preferowanych metod:

# 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) jest moim preferowanym rozwiązaniem dla zapytania 1. Mnemonic NaRV oznacza „nie jest zwykłym wartość” .

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"