如何在R

时间:2017-11-06 07:14:03

标签: r

鉴于信息:

假设我有两个向量的列表(每个向量有10个元素)。另外,假设我有一个数组列表(列表中每个元素有10个数组)。这些阵列是下三角形。即上三角值为零。

代码:

载体:

x <- list(rnorm(10,0,2), rnorm(10,2,2))

数组:

set.seed(47)
a <- vector("list",2)

for( i in seq_along(a)){

a[[i]] <- array(rnorm(5 * 5 * 10), c(5, 5, 10))
for(k in seq(dim(a[[1]])[3])) a[[i]][,,k][upper.tri(a[[i]][,,k], diag = TRUE)] <- 0

}

需要:

我想将每个向量的每个元素乘以列中相应的数组元素。也就是说,

  1. 将第一个向量的第一个元素乘以数组的第一个元素的第一个元素(数组列表的第一个元素)。
  2. 然后将第一个向量的第二个元素乘以数组的第二个元素。
  3. 对具有数组列表的第二个数组的第二个向量执行相同的操作。
  4. 即,

    每个向量包含10个元素,每个数组有10个值。我想将向量的第一个值乘以数组的第一个值,并为其他元素执行此操作。

    实施例

    > x
    [[1]]
     [1]  1.2062716  1.4671676 -2.9603710 -4.2447263  1.4897441  3.8680305  0.7318295 -3.9691290 -0.8161910
    [10]  0.8807681
    
    [[2]]
     [1]  0.80512691 -0.03917115  2.58162187  2.91426812  2.78445280  0.32298579  2.33907433 -0.70444579
     [9] -0.52903520  4.60506480
    
    [[1]]
    , , 1
    
               [,1]        [,2]        [,3]        [,4] [,5]
    [1,]  0.0000000  0.00000000  0.00000000  0.00000000    0
    [2,]  0.7111425  0.00000000  0.00000000  0.00000000    0
    [3,]  0.1854053  0.01513086  0.00000000  0.00000000    0
    [4,] -0.2817650 -0.25204590 -1.82822917  0.00000000    0
    [5,]  0.1087755 -1.46575030  0.09147291 -0.04057817    0
    
    , , 2
    
                [,1]       [,2]      [,3]       [,4] [,5]
    [1,]  0.00000000  0.0000000 0.0000000  0.0000000    0
    [2,] -1.60815993  0.0000000 0.0000000  0.0000000    0
    [3,] -2.32237229 -1.2004406 0.0000000  0.0000000    0
    [4,] -1.96721918  0.8852306 0.5066870  0.0000000    0
    [5,]  0.02752681  0.8869350 0.5643018 -0.4876964    0
    

    我想将第一个列表的第一个元素乘以第一个元素(数组列表的第一个元素),即

     1.2062716  *  0.7111425  
    

    1.2062716  * -1.60815993  
    
    1.4671676 * 0.1854053  
    

    1.4671676 * -2.32237229 
    

    然后第一个元素的预期乘法是

    > a[[1]][,,1]*x[[1]][1]
               [,1]        [,2]       [,3]       [,4] [,5]
    [1,]  0.0000000  0.00000000  0.0000000  0.0000000    0
    [2,]  0.8578310  0.00000000  0.0000000  0.0000000    0
    [3,]  0.2236491  0.01825193  0.0000000  0.0000000    0
    [4,] -0.3398851 -0.30403580 -2.2053409  0.0000000    0
    [5,]  0.1312129 -1.76809293  0.1103412 -0.0489483    0
    

    答案的结果是:

    [[1]]
    , , 1
    
               [,1]        [,2]        [,3]        [,4] [,5]
    [1,]  0.0000000  0.00000000  0.00000000  0.00000000    0
    [2,]  0.8578310  0.00000000  0.00000000  0.00000000    0
    [3,]  0.2720206  0.02254111  0.00000000  0.00000000    0
    [4,]  0.8341290 -0.97492123  7.25647738  0.00000000    0
    [5,] -0.4617224 -1.07267929 -0.07465937 -0.03573996    0
    

    对所有其他元素和列表的第二个元素执行相同的操作。

1 个答案:

答案 0 :(得分:1)

我们可以尝试Map

res <- Map(function(u, v) {
            u[u!=0] <- u[u!=0]*rep(v, dim(u)[3])
            u},
            a, x)
a[[1]][2,1,1]*x[[1]][1]
#[1] 0.3840722
a[[1]][2,1,2]*x[[1]][1]
#[1] -0.8685313

res[[1]][2, 1, 1]
#[1] 0.3840722
res[[1]][2, 1, 2]
#[1] -0.8685313