On Sun, May 20, 2012 at 10:54 AM, Gabor Grothendieck <ggrothendi...@gmail.com> wrote: > On Sun, May 20, 2012 at 10:52 AM, Gabor Grothendieck > <ggrothendi...@gmail.com> wrote: >> On Sun, May 20, 2012 at 10:17 AM, Nevil Amos <nevil.a...@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 ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.