R:如何根据名称在两个列表上运行函数/计算?

时间:2015-11-19 10:12:55

标签: r list mapply

我想根据名称在两个列表上运行一个函数(在这种情况下只是一个乘法)。这里显示了我的结构的一些示例数据:

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;谢谢

1 个答案:

答案 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