[R] deleting invariant rows and cols in a matrix

Jonathan Baron baron at cattell.psych.upenn.edu
Sun May 12 22:16:13 CEST 2002

```>On 05/11/02 15:49, Patrick McKnight wrote:
>>Greetings,
>>
>>I couldn't find any existing function that would allow me to scan a
>>matrix and eliminate invariant rows and columns so I have started to
>>write a simple routine from scratch.  The following code fails because
>>the array index goes out of bounds for obvious reasons you'll see
>>shortly.

Turns out my original idea didn't work, so I also figured out how
to do it recursively so that you get a matrix with no invariant
rows and columns, even if the invariant ones arise after deleting
other ones.  The function is mcyc, below.  Probably more
complicated than needed, but it works.

---------

mtest <- function(m1)
{
rowzeros <- apply(m1,1,sd)==0
colzeros <- apply(m1,2,sd)==0
m2 <- m1[rowzeros==F,colzeros==F]
d <- sum(dim(m1)-dim(m2))
return(m2,d)
}

mcyc <- function(m2)
{
m3 <- mtest(m2)
while(m3\$d!=0) {m2 <- m3\$m2;m3 <- mtest(m2)}
return(m3\$m2)
}

-------
For example:

> mcyc(matrix(c(1,1,1,1,4,3,1,2,2,4,4,4),3,))
[1] 4 3
--
Jonathan Baron, Professor of Psychology, University of Pennsylvania