将带有inf的行移动到R中的New matrix

时间:2013-03-05 17:22:11

标签: r row

所以我有一个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

由于

2 个答案:

答案 0 :(得分: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,]

另一种方式(但对我来说似乎有点笨拙)是使用行和:

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

如果您的矩阵有NA,那么这些方法会产生不同的结果!

m[2,2] = NA
m[!is.finite(rowSums(m)),]
m[cond,]

答案 1 :(得分: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