R 将矩阵乘以每个子列表

R 将矩阵乘以每个子列表,r,list,lapply,R,List,Lapply,我将矩阵tm乘以向量tb以生成响应向量。我需要将其应用于n个tb向量的列表,这将生成一个包含n个响应向量的列表。我正在努力让它在列表中重复,对于一个单独的例子,它是这样的: set.seed(19) n <- 10 k <- 4 tb <- list(split(rnorm(n*k, 0, 1),seq(1:n))) tm <- matrix(c(1.0, 0.1, 0.2, 0.3, 0.1, 1.0, 0.2, 0.1, 0.2, 0.2, 1.0, 0.5, 0.3

我将矩阵tm乘以向量tb以生成响应向量。我需要将其应用于n个tb向量的列表,这将生成一个包含n个响应向量的列表。我正在努力让它在列表中重复,对于一个单独的例子,它是这样的:

set.seed(19)
n <- 10
k <- 4
tb <- list(split(rnorm(n*k, 0, 1),seq(1:n)))
tm <- matrix(c(1.0, 0.1, 0.2, 0.3, 0.1, 1.0, 0.2, 0.1, 0.2, 0.2, 1.0, 0.5, 0.3, 0.1, 0.5, 1.0), ncol = k)
tm %*% as.vector(unlist(tb[[1]][1]))
但是,我尝试使用lappy/sapply获取所有10个响应向量,但这给了我一个意外的输出:

> sapply(tm, function(x) x %*% as.vector(unlist(tb)))
              [,1]          [,2]          [,3]          [,4]          [,5]
 [1,] -1.189453745 -0.1189453745 -0.2378907491 -0.3568361236 -0.1189453745
 [2,]  0.518629988  0.0518629988  0.1037259975  0.1555889963  0.0518629988
 [3,]  1.423423..   ...               ...           ...
这里只显示一个输出片段,它有16列40行,换句话说,矩阵的每个元素一列,n x k行。它似乎是取矩阵的第一个单元格,然后进行计算,然后是第二个单元格,第三个单元格,依此类推-正如你所看到的,当我取tm的单个元素时,这与sapply的输出相匹配:

> tm[1] %*% as.vector(unlist(tb[[1]][1]))
          [,1]    [,2]     [,3]     [,4]
[1,] -1.189454 0.51863 1.423423 1.504741

我的问题是,当使用lappy/sapply时,我如何让这个乘法像我单独使用它时那样使用整个矩阵?

我认为您只需要从tb定义中删除list函数:

set.seed(19)
n <- 10
k <- 4
tb <- split(rnorm(n*k, 0, 1),seq(1:n))
tm <- matrix(c(1.0, 0.1, 0.2, 0.3, 0.1, 1.0, 0.2, 0.1, 0.2, 0.2, 1.0, 0.5, 0.3, 0.1, 0.5, 1.0), ncol = k)
以及sapply的所有响应向量:

sapply(tb, function(x) x %*%tm )

1          2          3           4          5          6          7          8          9         10
[1,] -0.4014836  0.1513720 -0.1113092 -0.28636882  1.1300914 -0.7037464  1.5886556 -0.8908194 -0.6891749 -0.4927336
[2,]  0.8348435  0.6747836  0.6135654 -0.01236765  0.6523212 -0.3599526 -0.2293118  1.5190890  0.1165567 -0.7644372
[3,]  2.0416294 -0.9832891  0.3399474  1.04671293 -0.1986427 -0.4779628  1.3585457  1.0673985 -1.7597788 -0.4059126
[4,]  1.9114801 -0.7064887  0.5356257  0.57154412  0.8048432 -1.6563305  2.9935210 -1.3916476 -1.3746462 -0.9662248

别傻了,做一个矩阵乘法:tm%*%do.callcbind,tb[[1]]。太棒了,谢谢-把它作为答案,我会接受的!
tm %*% tb[[1]]
[,1]
[1,] -0.4014836
[2,]  0.8348435
[3,]  2.0416294
[4,]  1.9114801
sapply(tb, function(x) x %*%tm )

1          2          3           4          5          6          7          8          9         10
[1,] -0.4014836  0.1513720 -0.1113092 -0.28636882  1.1300914 -0.7037464  1.5886556 -0.8908194 -0.6891749 -0.4927336
[2,]  0.8348435  0.6747836  0.6135654 -0.01236765  0.6523212 -0.3599526 -0.2293118  1.5190890  0.1165567 -0.7644372
[3,]  2.0416294 -0.9832891  0.3399474  1.04671293 -0.1986427 -0.4779628  1.3585457  1.0673985 -1.7597788 -0.4059126
[4,]  1.9114801 -0.7064887  0.5356257  0.57154412  0.8048432 -1.6563305  2.9935210 -1.3916476 -1.3746462 -0.9662248