Olivier ETERRADOSSI
2014-Mar-13 14:02 UTC
[R] behaviour of rows and colomns suppression in a matrix
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
2014-Mar-13 15:12 UTC
[R] behaviour of rows and colomns suppression in a matrix
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.eterradossi at 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
Hi, You could use: ?TM2[!margin.Rows <=thresh,!margin.Cols <=thresh] #???? [,1] [,2] #[1,]??? 1??? 1 #[2,]??? 1??? 1 #[3,]??? 1??? 1 #For the first case: TM1[!margin.Rows <=thresh,!margin.Cols <=thresh] #???? [,1] [,2] #[1,]??? 1??? 1 #[2,]??? 1??? 1 A.K. On Thursday, March 13, 2014 10:02 AM, Olivier ETERRADOSSI <olivier.eterradossi at 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 ______________________________________________ R-help at 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.