[R] behaviour of rows and colomns suppression in a matrix
Olivier ETERRADOSSI
olivier.eterradossi at mines-ales.fr
Thu Mar 13 16:51:10 CET 2014
Thank you Sarah,
But no, I was not expecting this. For me integer(0) is not 0.
That's why I finally tested length(unused.rows), which is 0 when
unused.rows is integer(0).
Olivier
-----Message d'origine-----
De : Sarah Goslee [mailto:sarah.goslee at gmail.com]
Envoyé : jeudi 13 mars 2014 16:12
À : Olivier ETERRADOSSI
Cc : r-help
Objet : Re: [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
More information about the R-help
mailing list