我是使用嵌套列表的新手。因此,假设我的数据具有以下dput
:
mat_lag <- list(structure(list(V1 = 3:7, V2 = 11:15, V3 = 19:23), row.names = c(NA,
-5L), class = "data.frame"), structure(list(V1 = 2:6, V2 = 10:14,
V3 = 18:22), row.names = c(NA, -5L), class = "data.frame"),
structure(list(V1 = 1:5, V2 = 9:13, V3 = 17:21), row.names = c(NA,
-5L), class = "data.frame"))
和
PHI <- list(list(structure(1:9, .Dim = c(3L, 3L)), structure(1:9, .Dim = c(3L,
3L)), structure(1:9, .Dim = c(3L, 3L))), list(structure(1:9, .Dim = c(3L,
3L)), structure(1:9, .Dim = c(3L, 3L)), structure(1:9, .Dim = c(3L,
3L))))
我的想法是将mat_lag
中的3个矩阵与PHI
中的嵌套列表内的3个矩阵相乘。我的问题是我不确定如何操作嵌套列表,我只能为一个嵌套列表编写代码。
让我解释得更好。我正在寻找逐项乘法
如果我使用的是PHI[[1]]
,则代码如下:
Product <- lapply(1:length(mat_lag), function(index)
mapply(function(x, y) x*y, t(PHI[[1]][[index]]), mat_lag[[index]]))
结果如下:
[[1]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 3 44 133 6 55 152 9 66 171
[2,] 4 48 140 8 60 160 12 72 180
[3,] 5 52 147 10 65 168 15 78 189
[4,] 6 56 154 12 70 176 18 84 198
[5,] 7 60 161 14 75 184 21 90 207
[[2]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 2 40 126 4 50 144 6 60 162
[2,] 3 44 133 6 55 152 9 66 171
[3,] 4 48 140 8 60 160 12 72 180
[4,] 5 52 147 10 65 168 15 78 189
[5,] 6 56 154 12 70 176 18 84 198
[[3]]
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1 36 119 2 45 136 3 54 153
[2,] 2 40 126 4 50 144 6 60 162
[3,] 3 44 133 6 55 152 9 66 171
[4,] 4 48 140 8 60 160 12 72 180
[5,] 5 52 147 10 65 168 15 78 189
我想在PHI
更改时重复此操作,这意味着我想使用PHI[[1]]
和PHI[[2]]
。
我认为我可以使用for
循环,也可以使用function
,但是我正在使用function
在代码中定义索引。
答案 0 :(得分:0)
有多种方法可以实现您想要的目标。 (我假设您想要矩阵乘法%*%
,而不是逐项乘法*
。在这里,我将使用tcrossprod)
这是2个选项
result1 <- vector('list', 3)
for(i in 1:3){
result1[[i]] <- vector('list', 3)
for(j in 1:2){
result1[[i]][[j]] <- tcrossprod(PHI[[j]][[i]], mat_lag[[i]])
}
}
result2 <- lapply(1:3, function(x)lapply(1:2, function(z){
tcrossprod(PHI[[z]][[x]], mat_lag[[x]])
}))
两个都使用索引来遍历列表。
我们几乎可以使用mapply
result3 <- lapply(1:2, function(x)mapply(function(x, y) tcrossprod(x, y), x = PHI[[x]], y = mat_lag))
但这将结果作为一个大矩阵输出返回(并转置结果),因此必须进行一些进一步的格式化。
答案 1 :(得分:0)
Product <- lapply(1:length(PHI), function(index)
lapply(1:length(mat_lag), function(z)
mapply(function(x, y) x*y, t(PHI[[index]][[z]]), mat_lag[[index]])
))