[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