[R] binary symmetric matrix combination
arun
smartpink111 at yahoo.com
Thu Sep 5 22:30:00 CEST 2013
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 <smartpink111 at yahoo.com>
To: R help <r-help at 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!
More information about the R-help
mailing list