我有一个矩阵如下。
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
我想创建四个矩阵(5 * 4),每个矩阵列通过自身相乘得到,然后每对行值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)如
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
如何在R中有效地进行?
答案 0 :(得分:1)
运行
res <- lapply(1:ncol(dat), function(i) dat * dat[,i])
由于元素倍增的再循环,将起作用。如果乘以一列,这些值将在整个矩阵上重复。并且lapply
会将它们全部返回到列表中。您可以将其res[[1]]
,res[[2]]
等单独列出。
答案 1 :(得分:0)
test<-NULL
for (i in 1:ncol(dat)){
x<-dat*dat[,i]
test[i]<-list(x)
}
与@ Mrflick的评论相同
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