索引由矩阵组成的列表中的循环

时间:2015-07-07 13:45:07

标签: r list for-loop matrix

我正在努力正确索引下面的代码段。也许我的数据设置也不理想。

首先,我想比较abcd bd中两列之间的值 以及每组生成的RandomNum行。 如果RandomNum中的行值大于b abcd值, 那么它应该= 0,否则它应该= 1 结果将是一个包含两个矩阵的列表,一个比较列b 使用上述标准对d中的每组行值(作为向量)进行一列或向量RandomNum。 结果列表将包含2个矩阵,其维度为nv * rp,并将保存为列表UDRandomNum。 然后,我想在UDRandomNum行或列3中的结果值0或1之间取一个差异,每次从b中的dabcd列中扣除它。因此,Differences中保存的结果将再次具有两个矩阵,每个矩阵将三个向量集与来自b的同一列dabcd进行比较。我希望这是有道理的。

set.seed(101)
a <- c(0.1,0.2,0.3)
b <- c(0.8,0.2,0.5)
c <- c(0.4,0.9,1.0)
d <- c(0.7,0.9,0.2)
ab <- cbind(a,b)
cd <- cbind(c,d)
abcd <- list(ab,cd)

rp <- 100
nv <- length(a)

RandomNum <- vector("list",length(a))

# Draw random values between 0 and 1 from the uniform distribution
for (i in 1:length(a)) {
        RandomNum[[i]] <- t(replicate(rp, runif(nv, min=0,max=1)))
}

有问题的作品从这里开始:

UDRandomNum <- vector("list",length(abcd))

for (i in 1:length(abcd)) {
        UDRandomNum[[i]] <- RandomNum[[i]][i] < 
                abcd[[i]][,2][col(RandomNum[[i]])]+0
}

# Later, I want to take the difference between the outcomes (1 or 0)

Differences <- vector("list",length(abcd))

for (i in 1:length(abcd)) {
            Differences[[i]] <- abs(sweep(UDRandomNum,2,abcd[,2]))
}

所以我的RandomNum我的结果始于:

[[1]]
              [,1]       [,2]        [,3]
  [1,] 0.076929106 0.42883794 0.502711454
  [2,] 0.254765247 0.57422550 0.578616861
  [3,] 0.270195792 0.30920944 0.094095268
  [4,] 0.512404975 0.97536980 0.082336057
  ...

我将它与b进行比较:0.8,0.2,0.5(如果RandomNum中的值为&gt; b则为0,否则为1)

UDRandomNum:

[[1]]
       [,1]  [,2]  [,3]
  [1,] 1     0     0
  [2,] 1     0     0 
  [3,] 1     0     1 
  [4,] 1     0     1
  ...

最后,我会从b中扣除UDRandomNum中的值,因此Differences中的结果将会跟随(无论为方便起见,我输入的方程结果如何,但它应该是由此公式得出的数字)

  [[1]]
       [,1]               [,2]              [,3]
  [1,] abs(1-0.076929106) abs(0-0.42883794) abs(0-0.502711454)
  [2,] abs(1-0.254765247) abs(0-0.57422550) abs(0-0.578616861)
  [3,] abs(1-0.270195792) abs(0-0.30920944) abs(1-0.094095268)
  [4,] abs(1-0.512404975) abs(0-0.97536980) abs(1-0.082336057)
  ...

1 个答案:

答案 0 :(得分:0)

UDRandomNum <- vector("list",length(abcd))

for (i in 1:length(abcd)) {
        UDRandomNum[[i]] <- RandomNum[[1]] < 
          matrix(abcd[[i]][,2][col(RandomNum[[i]])], ncol=3)
}

Differences <- vector("list",length(abcd))

for (i in 1:length(abcd)) {
            Differences[[i]] <- abs(UDRandomNum[[i]] - RandomNum[[i]])
}

<强>解释

使用UDRandomNum列表,尝试将abcd b和d列更改为与RandomNum维度匹配的矩阵。对于Differences列表,当您减去两个矩阵TRUEFALSE时,R会自动将UDRandomNumRandomNum结果强制转换为1和0。 / p>