Как управлять матрицами в списках? - PullRequest
1 голос
/ 16 марта 2020

Я новый пользователь R, и теперь я использую команду mapply для операций между матрицами; Моя исходная задача имеет два списка по 30 матриц в каждом; однако для лучшего объяснения моей проблемы я буду использовать только 6 матриц.

Phi1<-matrix(1:9, ncol = 3)
Phi2<-matrix(10:18, ncol = 3)
Phi3<-matrix(0:-8, ncol = 3)

mat <- matrix(1:24, ncol = 3)
p <- 3 
m <- 5 
mat_df <- as.data.frame(mat)
mat_lag <- map(1:p, ~ mutate_all(mat_df, lag, .x)) %>% 
map(drop_na) %>% 
map(~ slice(.x, (nrow(.x) - m + 1):nrow(.x)))
mat_lag %>% 
map(as.matrix)
PHI<-list(Phi1, Phi2, Phi3)

Моя идея состоит в том, чтобы умножить элементы PHI(i) на mat_lag[[i]].

Example<-mapply(function(x, y) x*y,  t(Phi1), mat_lag[[1]])

Проблема в том, что в моей исходной задаче у меня есть 30 матриц, и я не хочу делать это вручную, извлекая каждый элемент списка. С помощью приведенной выше команды я получаю желаемый результат, а именно:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]   23  147  319   27  159  339   31  171  359
[2,]   34  161  336   39  174  357   44  187  378
[3,]   45  175  353   51  189  375   57  203  397
[4,]   56  189  370   63  204  393   70  219  416
[5,]   67  203  387   75  219  411   83  235  435

Однако я не понимаю, как применить эту команду к списку, так что мой конечный результат будет список с размером 30 матриц 5 * 9

1 Ответ

2 голосов
/ 16 марта 2020

Не самый элегантный (может быть медленным для 30 матриц):

  lapply(1:length(mat_lag),function(index)
  mapply(function(x, y) x*y,  t(PHI[[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,]   20  130  288   22  140  306   24  150  324
[2,]   30  143  304   33  154  323   36  165  342
[3,]   40  156  320   44  168  340   48  180  360
[4,]   50  169  336   55  182  357   60  195  378
[5,]   60  182  352   66  196  374   72  210  396

[[3]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]    0  -27 -102   -1  -36 -119   -2  -45 -136
[2,]    0  -30 -108   -2  -40 -126   -4  -50 -144
[3,]    0  -33 -114   -3  -44 -133   -6  -55 -152
[4,]    0  -36 -120   -4  -48 -140   -8  -60 -160
[5,]    0  -39 -126   -5  -52 -147  -10  -65 -168

Результат примера OP:

mapply(function(x, y) x*y,  t(Phi1), mat_lag[[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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...