An embedded and charset-unspecified text was scrubbed... Name: not available URL: <https://stat.ethz.ch/pipermail/r-help/attachments/20110429/71f1bae4/attachment.pl>
matrix evaluation using if function
3 messages · Ivan, David Winsemius, Berend Hasselman
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
David Winsemius wrote:
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"
Wouldn't this do it too (dsince the diagonal is set to false by lower.tri)?: rownames(which(n == t(n) & lower.tri(n), arr.ind=TRUE)) Berend -- View this message in context: http://r.789695.n4.nabble.com/matrix-evaluation-using-if-function-tp3483188p3483785.html Sent from the R help mailing list archive at Nabble.com.