[R] removeing only rows/columns with "na" value from square ( symmetrical ) matrix.

Gabor Grothendieck ggrothendieck at gmail.com
Mon May 21 15:02:51 CEST 2012


On Sun, May 20, 2012 at 10:54 AM, Gabor Grothendieck
<ggrothendieck at gmail.com> wrote:
> On Sun, May 20, 2012 at 10:52 AM, Gabor Grothendieck
> <ggrothendieck at gmail.com> wrote:
>> On Sun, May 20, 2012 at 10:17 AM, Nevil Amos <nevil.amos at monash.edu> wrote:
>>> I have some square matrices with na values in corresponding rows and
>>> columns.
>>>
>>> M<-matrix(1:2,10,10)
>>> M[6,1:2]<-NA
>>> M[10,9]<-NA
>>> M<-as.matrix(as.dist(M))
>>> print (M)
>>>
>>>    1 2 3 4 5 6 7 8 9 10
>>> 1   0  2 1 2 1 NA 1 2  1  2
>>> 2   2  0 1 2 1 NA 1 2  1  2
>>> 3   1  1 0 2 1  2 1 2  1  2
>>> 4   2  2 2 0 1  2 1 2  1  2
>>> 5   1  1 1 1 0  2 1 2  1  2
>>> 6  NA NA 2 2 2  0 1 2  1  2
>>> 7   1  1 1 1 1  1 0 2  1  2
>>> 8   2  2 2 2 2  2 2 0  1  2
>>> 9   1  1 1 1 1  1 1 1  0 NA
>>> 10  2  2 2 2 2  2 2 2 NA  0
>>>
>>>
>>> How do I remove just the row/column pair( in this trivial example row 6 and
>>> 10 and column 6 and 10) containing the NA values?
>>>
>>> so that I end up with all rows/ columns that are not NA - e.g.
>>>
>>>  1 2 3 4 5 7 8 9
>>> 1 0 2 1 2 1 1 2 1
>>> 2 2 0 1 2 1 1 2 1
>>> 3 1 1 0 2 1 1 2 1
>>> 4 2 2 2 0 1 1 2 1
>>> 5 1 1 1 1 0 1 2 1
>>> 7 1 1 1 1 1 0 2 1
>>> 8 2 2 2 2 2 2 0 1
>>> 9 1 1 1 1 1 1 1 0
>>>
>>
>> Try this:
>>
>> ix <- na.action(na.omit(replace(M, upper.tri(M), 0)))
>> M[-ix, -ix]
>
> and here is a minor variation which is slightly shorter:
>
> ix <- complete.cases(replace(M, upper.tri(M), 0))
> M[ix, ix]
>

Please keep all follow ups on the original thread.

Here is a greedy algorithm to iteratively drop the column and row with
the most NAs.

dropNA <- function(M) {
   while(any(is.na(M))) {
      ix <- which.max(colSums(is.na(M)))
      M <- M[-ix, -ix]
   }
   M
}

dropNA(M)

-- 
Statistics & Software Consulting
GKX Group, GKX Associates Inc.
tel: 1-877-GKX-GROUP
email: ggrothendieck at gmail.com



More information about the R-help mailing list