我想根据名称在两个列表上运行一个函数(在这种情况下只是一个乘法)。这里显示了我的结构的一些示例数据:
A <- list("111"=matrix(sample(1:10,9), nrow=3, ncol=3),
"112"=matrix(sample(1:10,9), nrow=3, ncol=3))
names <- list(c("A", "B", "C"), c("A", "B", "C"))
A <- lapply(ProdValues, function (x) {dimnames(x) <- names; return(x)})
列表A具有不同产品的矩阵值(列表名称= 111,112),列表B(下图)具有相同产品的年份值,名称由产品和年份组成,并以&#34;分隔。&#34; (例如111.2000):
B <- list("111.2000"=matrix(sample(1:10,9), nrow=3, ncol=3),
"112.2000"=matrix(sample(1:10,9), nrow=3, ncol=3),
"111.2001"=matrix(sample(1:10,9), nrow=3, ncol=3),
"112.2001"=matrix(sample(1:10,9), nrow=3, ncol=3))
names <- list(c("A", "B", "C"), c("A", "B", "C"))
B <- lapply(ProdYears, function (x) {dimnames(x) <- names; return(x)})
到目前为止,我使用mapply运行我的乘法:
fun <- function(A, B) {
calc= A*B
return(calc)
}
mapply(fun, A, B, SIMPLIFY = FALSE)
在这种情况下提供了一个怀特的结果。但是,丢失B的名称对我来说是重要的。另一个问题是B有更多的对象然后A,因此我想在计算中运行名称匹配:例如A中的名称111,应匹配B 111.2000和111.2001中的名称。有任何想法吗?
注意:产品名称也可能有两位数,而不仅仅是3.所以我需要使用&#34;前面的数字进行匹配。&#34;谢谢
答案 0 :(得分:2)
您可以使用Map
循环显示B和B名称,这也会保留名称:
Map(function(x,y) A[[y]]*x, B, gsub('\\..*','',names(B)))
#$`111.2000`
# [,1] [,2] [,3]
#[1,] 36 18 54
#[2,] 16 25 3
#[3,] 56 10 20
#$`112.2000`
# [,1] [,2] [,3]
#[1,] 18 10 40
#[2,] 35 18 60
#[3,] 3 63 16
#$`111.2001`
# [,1] [,2] [,3]
#[1,] 81 30 18
#[2,] 56 25 1
#[3,] 28 20 16
#$`112.2001`
# [,1] [,2] [,3]
#[1,] 36 30 72
#[2,] 30 30 6
#[3,] 5 56 4