Skip to content
Back to formatted view

Raw Message

Message-ID: <23533F75-89A0-43F8-9822-5D6BA30DECF0@comcast.net>
Date: 2011-04-29T12:41:13Z
From: David Winsemius
Subject: matrix evaluation using if function
In-Reply-To: <BANLkTinmt0nL2Kyz=S1rdTY3_vXrSmdQ1g@mail.gmail.com>

On Apr 29, 2011, at 4:27 AM, ivan wrote:

> Hi All,
>
> I am trying to create a function which evaluates whether the values  
> (which
> are equal to one) of a matrix are the same as their mirror values.  
> Consider
> the following matrix:
>
>> n<-matrix(cbind(c(0,1,1),c(1,0,0),c(0,1,0)),3,3)
>> colnames(n)<-cbind("A","B","C");rownames(n)<-cbind("A","B","C")
>> n
>  A B C
> A 0 1 0
> B 1 0 1
> C 1 0 0
>
> Hence, since n[2,1] and n[1,2] are 1 and the same, the function should
> return the name of the row of n[2,1]. I used the following function:
>
> for (i in length(rownames(n))) {
>
> for (j in length(colnames(n))){
>
> if(n[i,j]==n[j,i]){
>
> rownames(n)[[i]]->output} else {}
>
> }
>
> }
>
>> output
> NULL
>
> The right answer would have been "B", though.

Can you explain why "A" would not be an equally good answer to satisfy  
your problem set up?

 > which(n == t(n) & col(n) != row(n) , arr.ind=TRUE)
   row col
B   2   1
A   1   2
 > rownames(which(n == t(n) & col(n) != row(n) , arr.ind=TRUE) )
[1] "B" "A"

# Which would seem to be the correct answer, but
# This adds an additional constraint and also insures no diagonal  
elements

 > rownames(which(n == t(n) & col(n) != row(n) & lower.tri(n),  
arr.ind=TRUE) )
[1] "B"




> I simply do not see my
> mistake.

I would rather program a problem correctly that hash through errors in  
loop logic.
-- 

David Winsemius, MD
West Hartford, CT