所以我有一个 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
谢谢
您可以使用标准子集和函数来做到这一点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,]
因为你正在处理一个数字矩阵,abs()
并且==
会很快。
# Logical Vector
InfRows <- 0!=rowSums(abs(A) == Inf, na.rm=TRUE)
InfMat <- A[InfRows, ]
A.clean <- A[!InfRows, ]
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