rose
rose

Reputation: 1991

Creating special matrix in R

I have a matrix as follows.

dat = matrix(c(0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 2, 3, 4, 5, 6), ncol=4)
colnames(dat)=c("m1","m2","m3","m4")
dat
m1 m2 m3 m4
1  0  1  0  2
2  0  0  0  3
3  1  1  0  4
4  1  1  1  5
5  1  1  1  6

I would like to create four matrix(5*4) which each matrix column obtain by multiplying by itself and then each pair row values res1 = (m1*m1, m1*m2, m1*m3, m1*m4) , res2 = (m1*m2, m2*m2, m2*m3, m2*m4), res3 = (mm1*m3, m2*m3, m3*m3, m4*m3), res4 = (m1*m4, m2*m4, m3*m4, m4*m4) such as

res1
1  0  0  0  0
2  0  0  0  0
3  1  1  0  4
4  1  1  1  5
5  1  1  1  6
res2
1  1 1  0  2
2  0  0 0  0
3  1  1 0  4
4  1  1 1  5
5  1  1 1  6
res3
1  0  0 0 0
2  0  0 0 0
3  0  0 0 0
4  1  1 1 5
5  1  1 1 6
res4
1  0  2  0 4
2  0  0  0  9
3  4  4  0 16
4  5  5  5  25
5  6  6  6  36

How can I do it efficiently in R?

Upvotes: 1

Views: 524

Answers (2)

janicebaratheon
janicebaratheon

Reputation: 999

test<-NULL

for (i in 1:ncol(dat)){
 x<-dat*dat[,i]
test[i]<-list(x) 
}

same as @Mrflick's comment

test[[2]]
     m1 m2 m3 m4
[1,]  0  1  0  2
[2,]  0  0  0  0
[3,]  1  1  0  4
[4,]  1  1  1  5
[5,]  1  1  1  6

Upvotes: 0

MrFlick
MrFlick

Reputation: 206566

Running

res <- lapply(1:ncol(dat), function(i) dat * dat[,i])

will work thanks to the recycling of the element-wise multiplication. If you multiply by one column, those values will repeat over the entire matrix. And lapply will return them all in a list. You can get them out individually as res[[1]], res[[2]], etc.

Upvotes: 1

Related Questions