【问题标题】:Remove NA/NaN/Inf in a matrix删除矩阵中的 NA/NaN/Inf
【发布时间】:2013-03-24 06:47:52
【问题描述】:

我想尝试两件事:

  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'

【问题讨论】:

标签: r matrix rows na


【解决方案1】:
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

【讨论】:

  • 哦,抱歉,错过了 Inf.
  • 但是我的问题的第二部分呢?将它们全部设置为零并且根本不删除它们?
  • 您使用 is.finite(m) 返回逻辑矩阵这一事实。
  • 建议:使用m[apply(m, 1, Compose(is.finite, all)), , drop=FALSE] 避免丢失尺寸。
【解决方案2】:

另一种方式(针对第一个问题):

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

除了马修对第二部分的回答,我想不出别的了。

【讨论】:

    【解决方案3】:

    我想我会用我喜欢的方法把帽子扔进擂台:

    # 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
    

    【讨论】:

      【解决方案4】:

      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"
      

      【讨论】:

      • 很棒的包!正是我需要的!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 2020-01-25
      • 2020-01-07
      • 1970-01-01
      • 2017-01-09
      • 2014-09-21
      • 2012-02-13
      相关资源
      最近更新 更多