Hi, Your basic problem seems to be that you expect R to take
TM2[0, ] as meaning not to subset anything, rather than to take only row 0, which doesn't exist: R> TM2[0,] [,1] [,2] [,3] There's a hint in ?"[" which says: An index value of 'NULL' is treated as if it were 'integer(0)'. Here are two alternative formulations of your task: # safer method 1 used.rows<-which(margin.Rows > thresh) used.cols<-which(margin.Cols > thresh) TM2[used.rows, used.cols] # safer method 2 unused.rows<- margin.Rows<=thresh unused.cols<- margin.Cols<=thresh TM2[!unused.rows, !unused.cols] Sarah On Thu, Mar 13, 2014 at 10:02 AM, Olivier ETERRADOSSI <olivier.eterrado...@mines-ales.fr> wrote: > Hi List, > while running a script on a set of matrices I came into a case I would not > have guessed to arrive. > Below is a small toy example to illustrate the case. > Of course there is a simple workaround (using a simple test), but why does > this occur, and shouldn't it be corrected ? > > More probably I miss a point, but which one ? Is this behavior obtained on > purpose and why ? > Sorry if it's a FAQ... I didn't find my way to it. > (And sorry for multiple posting if any : I got a warning from r-bounce but > did not understand it). > Thanks, Olivier > > > ############################################# > # toy example 1 (no problem with this one) > > toy.matrix.1<-matrix(c(1,0,1,1,0,1,0,0,0),3,3) > # getting the marginal sums > margin.Rows<- apply(toy.matrix.1,MARGIN=1,FUN=sum) > margin.Cols<- apply(toy.matrix.1,MARGIN=2,FUN=sum) > #giving a threshold for lines and columns suppression > thresh<-0 > # finding the items to remove > unused.rows<-which(margin.Rows<=thresh) # unused.rows == 2 > unused.cols<-which(margin.Cols<=thresh) # unused.cols == 3 > TM1<-toy.matrix.1 > TM1<-TM1[-unused.rows,] > TM1<-TM1[,-unused.cols] > TM1 > # [,1] [,2] > #[1,] 1 1 > #[2,] 1 1 # OK > ############################################## > > # toy example 2 (oops, no rows to suppress...) > > toy.matrix.2<-matrix(c(1,1,1,1,1,1,0,0,0),3,3) > # getting the marginal sums > margin.Rows<- apply(toy.matrix.2,MARGIN=1,FUN=sum) > margin.Cols<- apply(toy.matrix.2,MARGIN=2,FUN=sum) > #giving a threshold for lines and columns suppression > thresh<-0 > unused.rows<-which(margin.Rows<=thresh) # unused.rows == > integer(0) > unused.cols<-which(margin.Cols<=thresh) # unused.cols == 3 > TM2<-toy.matrix.2 > TM2<-TM2[-unused.rows,] > TM2<-TM2[,-unused.cols] > TM2 > # [,1] [,2] # empty... > ############################################### > # I was expecting : > # [,1] [,2] > #[1,] 1 1 > #[2,] 1 1 > #[3,] 1 1 > > # which of course is obtained using : > TM2<-toy.matrix.2 > if(length(unused.rows) !=0) {TM2<-TM2[-unused.rows,]} > if(length(unused.rows) !=0 ){TM2<-TM2[,-unused.cols]} > TM2 -- Sarah Goslee http://www.functionaldiversity.org ______________________________________________ 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.