Also, some of the steps could be reduced by: names1<-unique(c(colnames(m1),colnames(m2),colnames(m3),colnames(m4))) Out3<-matrix(0,length(names1),length(names1),dimnames=list(names1,names1)) lst1<-sapply(paste0("m",1:4),function(x) {x1<- get(x); x2<-paste0(colnames(x1)[col(x1)],rownames(x1)[row(x1)]); match(x2,vecOut)}) lst2<- list(m1,m2,m3,m4) N<- length(lst1)
fn1<- function(N,Out){ i=1 while(i<=N){ Out[lst1[[i]]]<-lst2[[i]] i<-i+1 } Out } fn1(N,Out3) # y1 g24 c1 c2 l17 h4 s2 s30 e5 l15 #y1 0 1 1 1 1 1 1 1 1 1 #g24 1 0 0 0 0 0 0 0 0 0 #c1 1 0 0 1 1 0 0 0 0 0 #c2 1 0 1 0 1 0 0 0 0 0 #l17 1 0 1 1 0 0 0 0 0 0 #h4 1 0 0 0 0 0 1 1 0 0 #s2 1 0 0 0 0 1 0 1 0 0 #s30 1 0 0 0 0 1 1 0 0 0 #e5 1 0 0 0 0 0 0 0 0 1 #l15 1 0 0 0 0 0 0 0 1 0 identical(Out2,fn1(N,Out3)) #[1] TRUE A.K. ----- Original Message ----- From: arun <smartpink...@yahoo.com> To: R help <r-help@r-project.org> Cc: Sent: Thursday, September 5, 2013 4:09 PM Subject: Re: binary symmetric matrix combination Hi, May be this helps: m1<- as.matrix(read.table(text=" y1 g24 y1 0 1 g24 1 0 ",sep="",header=TRUE)) m2<-as.matrix(read.table(text="y1 c1 c2 l17 y1 0 1 1 1 c1 1 0 1 1 c2 1 1 0 1 l17 1 1 1 0",sep="",header=TRUE)) m3<- as.matrix(read.table(text="y1 h4 s2 s30 y1 0 1 1 1 h4 1 0 1 1 s2 1 1 0 1 s30 1 1 1 0",sep="",header=TRUE)) m4<- as.matrix(read.table(text="y1 e5 l15 y1 0 1 1 e5 1 0 1 l15 1 1 0",sep="",header=TRUE)) ###desired output: at some place the label is "s2" and at other "s29". I used "s2" for consistency Out1<- as.matrix(read.table(text="y1 g24 c1 c2 l17 h4 s2 s30 e5 l15 y1 0 1 1 1 1 1 1 1 1 1 g24 1 0 0 0 0 0 0 0 0 0 c1 1 0 0 1 1 0 0 0 0 0 c2 1 0 1 0 1 0 0 0 0 0 l17 1 0 1 1 0 0 0 0 0 0 h4 1 0 0 0 0 0 1 1 0 0 s2 1 0 0 0 0 1 0 1 0 0 s30 1 0 0 0 0 1 1 0 0 0 e5 1 0 0 0 0 0 0 0 0 1 l15 1 0 0 0 0 0 0 0 1 0",sep="",header=TRUE)) names1<-unique(c(colnames(m1),colnames(m2),colnames(m3),colnames(m4))) Out2<-matrix(0,length(names1),length(names1),dimnames=list(names1,names1)) vec1<- paste0(colnames(m1)[col(m1)],rownames(m1)[row(m1)]) vecOut<- paste0(colnames(Out2)[col(Out2)],rownames(Out2)[row(Out2)]) Out2[match(vec1,vecOut)]<- m1 vec2<- paste0(colnames(m2)[col(m2)],rownames(m2)[row(m2)]) Out2[match(vec2,vecOut)]<- m2 vec3<- paste0(colnames(m3)[col(m3)],rownames(m3)[row(m3)]) Out2[match(vec3,vecOut)]<- m3 vec4<- paste0(colnames(m4)[col(m4)],rownames(m4)[row(m4)]) Out2[match(vec4,vecOut)]<- m4 all.equal(Out1,Out2) #[1] TRUE Out2 y1 g24 c1 c2 l17 h4 s2 s30 e5 l15 y1 0 1 1 1 1 1 1 1 1 1 g24 1 0 0 0 0 0 0 0 0 0 c1 1 0 0 1 1 0 0 0 0 0 c2 1 0 1 0 1 0 0 0 0 0 l17 1 0 1 1 0 0 0 0 0 0 h4 1 0 0 0 0 0 1 1 0 0 s2 1 0 0 0 0 1 0 1 0 0 s30 1 0 0 0 0 1 1 0 0 0 e5 1 0 0 0 0 0 0 0 0 1 l15 1 0 0 0 0 0 0 0 1 0 A.K. I have the following binary labeled matrices with different dimensions (2x2, 3x3, 4x4) which I need to create in R as seen below: y1 g24 y1 0 1 g2 4 1 0 y1 c1 c2 l17 y1 0 1 1 1 c1 1 0 1 1 c2 1 1 0 1 l17 1 1 1 0 y1 h4 s2 s30 y1 0 1 1 1 h4 1 0 1 1 s29 1 1 0 1 s30 1 1 1 0 y1 e5 l15 y1 0 1 1 e5 1 0 1 l15 1 1 0 Then, I need to combine them to achieve the following result: y1 g24 c1 c2 l17 h4 s29 s30 e5 l15 y1 0 1 1 1 1 1 1 1 1 1 g24 1 0 0 0 0 0 0 0 0 0 c1 1 0 0 1 1 0 0 0 0 0 c2 1 0 1 0 1 0 0 0 0 0 l17 1 0 1 1 0 0 0 0 0 0 h4 1 0 0 0 0 0 1 1 0 0 s29 1 0 0 0 0 1 0 1 0 0 s30 1 0 0 0 0 1 1 0 0 0 e5 1 0 0 0 0 0 0 0 0 1 l15 1 0 0 0 0 0 0 0 1 0 Your help would be very much appreciated. ps. if the matrices don't appear correctly, please notice that all values different from 0 and 1 are row and column names Thank You! ______________________________________________ R-help@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.