1

所以我有一个 NxN 矩阵,其中一些行的值具有 inf。我想要做的是将它们移动到自己单独的矩阵中。这是一个例子

 Matrix A
 1    3    9
 4    5    2
inf   6    7 
 0   inf   8

使用 inf 删除行

 Matrix A
 1    3    9
 4    5    2

 Inf Matrix
inf   6    7 
 0   inf   8

谢谢

4

2 回答 2

2

您可以使用标准子集和函数来做到这一点is.infinite

##First create some data
m = matrix(1:12, ncol=3)
m[3,1] = Inf; m[4,2] = Inf

然后我们计算子集的条件:

cond = apply(m, 1, function(i) any(is.infinite(i)))

然后像往常一样子集:

m[!cond,]
m[cond,]

另一种方法(但对我来说似乎有点 hacky)是使用行总和:

m[is.finitie(rowSums(m)),]
m[!is.finite(rowSums(m)),]

并不是说如果您的矩阵有NA,那么这些方法会给出不同的结果!

m[2,2] = NA
m[!is.finite(rowSums(m)),]
m[cond,]
于 2013-03-05T17:24:50.253 回答
1

因为你正在处理一个数字矩阵,abs()并且==会很快。

 # Logical Vector
 InfRows <- 0!=rowSums(abs(A) == Inf, na.rm=TRUE)

 InfMat  <- A[InfRows,  ]
 A.clean <- A[!InfRows, ] 

编辑:如果您需要允许 NA,只需使用na.rm参数rowSums()

# same as above, but using na.rm
InfRows <- 0 != rowSums(abs(A) == Inf, na.rm=TRUE)
例子:
  A[2:3, 2] <- NA
  A  
     # [,1] [,2] [,3]
# [1,]    1    3    9
# [2,]    4   NA    2
# [3,]  Inf   NA    7
# [4,]    0  Inf    8

InfRows <- 0 != rowSums(abs(A) == Inf, na.rm=TRUE)

InfMat  <- A[InfRows,  ]
A.clean <- A[!InfRows, ] 

InfMat
#      [,1] [,2] [,3]
# [1,]  Inf   NA    7
# [2,]    0  Inf    8

A.clean
#      [,1] [,2] [,3]
# [1,]    1    3    9
# [2,]    4   NA    2
于 2013-03-05T18:13:59.103 回答