我想要乘以矩阵,一个包含值和0,另一个包含而不是0s NAs(这很重要)。这是关于两个较早问题(1和2)的新问题,因为我无法将这两个答案合并到最终解决方案中。这里有一些示例数据:
A <- list("111"= matrix(c(NA,NA,100,200,NA,NA),
nrow = 1, byrow = T),
"112"= matrix(c(10,90,NA,30,10,90),
nrow = 1, byrow = T))
B <- list("111.2012"=matrix(c(1, 0, 6, 0, 1, 0),
nrow = 1, byrow = T),
"112.2012"=matrix(c(6, 2, 2, 0, 3, 1),
nrow = 1, byrow = T),
"111.2011"=matrix(c(3, 2, 0, 0, 1, 9),
nrow = 1, byrow = T),
"112.2011"=matrix(c(1, 2, 0, 0, 7, 0),
nrow = 1, byrow = T))
首先,按名称匹配列表很重要(或者B是名称的第一部分),为此,我使用问题(1)的答案:
Map(function(x,y) A[[y]]*x, B, gsub('\\..*','',names(B)))
通过将0(在B中)与值(在A中)相乘,我得到0并且通过将值(在B中)与NA(在A中)相乘,我得到NA,这对我来说是真实的并且完全正常。但是,当我将0(B)与NA(A)相乘时,我得到NA,这可能是真的。但有没有办法获得0(这是我的问题2,但不包括1)?
为此,我得到了答案(问题2):
B*`[<-`(A,B==0,0)
以及列表的可能结果,使用旧代码(1):
Map(function(x,y) A[[y]]*`[<-`(x,A[[y]]==0,0),B,sub('\\..*','',names(B)))
我意识到应该转动A和B.但是,我正在努力解决这个问题。你有没有关于代码应该是什么样子的想法(也可以使用另一个2或甚至是新的答案)?感谢。
我的预期结果是:
> res
$`111.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA 0 600 0 NA 0
$`112.2012`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 60 180 NA 0 30 90
$`111.2011`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] NA NA 0 0 NA NA
$`112.2011`
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 10 180 0 0 70 0
注意:在元素一($'111.2012')中,第二和第六个条目为0,如元素四($'112.2011')第三个条目。