【问题标题】:Indexing for loops in lists consisting of matrices在由矩阵组成的列表中为循环索引
【发布时间】:2015-07-07 13:45:06
【问题描述】:

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

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

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 中的值 > 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)
  ...

【问题讨论】:

  • 为什么这个代码和:stackoverflow.com/questions/31267597/…
  • 您能否分享一个示例,说明您希望如何将列 b 和 d 与 RandomNum 进行比较?
  • @so13eit :我做到了,希望对您有所帮助
  • 为什么要创建pa 列?
  • RandomNumUDRandomNum 的尺寸也不同——RandomNum 的长度为 3,UDRandomNum 的长度为 2。

标签: r list for-loop matrix


【解决方案1】:
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 列表,当您减去UDRandomNumRandomNum 两个矩阵时,R 会自动将TRUEFALSE 结果强制为1 和0。

【讨论】:

    猜你喜欢
    • 2019-09-08
    • 2017-05-03
    • 1970-01-01
    • 2015-07-24
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多