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.