避免循环和乘以矩阵元素的列表

时间:2016-06-07 09:18:54

标签: r

我正在处理一些列表和矩阵,我在处理数据方面遇到了一些问题。假设我定义了以下矩阵和列表(仅作为示例):

m1 <-array(rexp(5),dim=c(3,3,3))
mn <-apply(m1,1:2,mean)   
ms <-apply(m1,1:2,sum)
msqr <-apply(ms,1:2,sqrt)
list1 <- list(mn,ms)
list2 <- list(ms,msqr)

然后,我想从m1(具有不同的维度)中减去mn,但是避免循环..我的意思是,到目前为止,我做了类似的事情:

dif <- array(NA,dim=c(3,3,3))
      for(i in 1:3){
        for(j in 1:3){
         dif[i,j,]<- m1[i,j,]-mn[i,j]
         }
        }

另一方面,我想将两个列表相乘:list1和list2(逐个元素),以获得另一个,list3具有相同数量的元素。 我正在努力尝试...但我做得不好..我想我可以在两个例子中使用一些功能(mapply或sapply),但我看不出怎么样......有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

对于第一部分,我们可以复制'mn'值以创建与'm1'大小相同的array,然后进行元素减法

dif1 <- m1-array(rep(mn, dim(m1)[3]), dim(m1))
identical(dif, dif1)
#[1] TRUE

对于第二种情况,mapply可用于在list s的相应元素之间进行乘法。

mapply(`*`, list1, list2, SIMPLIFY = FALSE)

或我们unlist list*然后relist

relist(unlist(list1) * unlist(list2), skeleton = list1)