在矩阵中移除NA/NaN/Inf

19

我想尝试两件事:

  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,这是没有意义的。 - Joshua Ulrich
相关帖子:https://dev59.com/NWs05IYBdhLWcg3wANLj - zx8754
4个回答

42

我想我会提出我的偏爱方法:

# 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

你如何删除带有NA的列?'m[!colSums(!is.finite(m)),]'无法工作。 - vog
1
@vog:你正在按行对'm'进行子集操作。对于列,你需要使用m [,!colSums(!is.finite(m))] - Joshua Ulrich

13
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。 - Matthew Lundberg
但是我的问题的第二部分呢?将它们全部设置为零而不完全删除它们? - user2199881
您可以使用 is.finite(m) 函数返回一个逻辑矩阵。 - Matthew Lundberg
1
建议使用 m[apply(m, 1, Compose(is.finite, all)), , drop=FALSE] 来避免丢失维度。 - Ferdinand.kraft

9

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"

很棒的包!正是我所需要的! - lxcfuji

4

第一个问题的另一种方法:

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

我认为Matthew的回答是第二部分最好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接