したがって、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,]
もう 1 つの方法 (ただし、私にはもう少しハックに思えます) は、行の合計を使用することです。
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