Remove NA/NaN/Inf in a matrix

后端 未结 4 2110
轮回少年
轮回少年 2020-12-06 00:44

I want to try two things :

  1. How do I remove rows that contain NA/NaN/Inf
  2. How do I set value of data point from NA/NaN/Inf to 0.

So far

相关标签:
4条回答
  • 2020-12-06 00:57
    library(functional)
    m[apply(m, 1, Compose(is.finite, all)),]
    

    Demonstration:

    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
    

    Note: Compose(is.finite, all) is equivalent to function(x) all(is.finite(x))

    To set the values to 0, use matrix indexing:

    m[!is.finite(m)] <- 0
    m
    ##      [,1] [,2]
    ## [1,]    1    0
    ## [2,]    2    4
    ## [3,]    3    5
    
    0 讨论(0)
  • 2020-12-06 00:59

    I guess I'll throw my hat into the ring with my preferred methods:

    # 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
    
    0 讨论(0)
  • 2020-12-06 01:08

    NaRV.omit(x) is my preferred option for question 1. Mnemonic NaRV means "not a regular value".

    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"
    
    0 讨论(0)
  • 2020-12-06 01:09

    Just another way (for the first question):

    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
    

    I can't think anything else other than Matthew's answer for the second part.

    0 讨论(0)
提交回复
热议问题