【问题标题】:R: for loop nestedR:for循环嵌套
【发布时间】:2018-05-13 20:52:35
【问题描述】:

我刚刚开始使用 R,在构建嵌套 FOR 循环时得到了意想不到的结果。当我运行下面的示例时,我希望它产生一个 40,000 x 1 向量(即从 t1=50 开始,然后从 0 到 1 迭代 t2,然后 t1=51 并从 0 到 1 迭代 t2),但是我得到了一个200x1 矢量。

对于这个极其基本的问题,我深表歉意。我刚刚开始使用 R,但在搜索中找不到直截了当的解释。

t1=seq(50, 150, 0.5) # 200x1 vector
t2=seq(0, 1, 0.005)  # 200x1 vector
   for (i in t1){

   for (j in t2){

   t3=3*t1+t2
 }
 }

【问题讨论】:

  • 我根本不知道 R,我希望结果是 200x1
  • 可能你在追求类似t3[(i- 1)*length(t1) + j ] <- 3 * t1[i] * t2[j]的东西?
  • 您的循环体根本不使用索引ij,因此虽然构建了一个40,000 个元素的向量元素,但不清楚您要做什么按元素是一个非常糟糕的主意。
  • 您在每次迭代时都会覆盖t3。您需要定义足够大的东西来容纳所有迭代。但是,您甚至没有进行迭代,因为您没有在任何地方使用 ij。你只是在计算3 * t1 + t2 很多次。
  • 顺便说一下——你的t1t2向量有201元素而不是200

标签: r for-loop nested nested-loops


【解决方案1】:

您可以使用expand.grid 不循环地做到这一点。

g <- expand.grid(t1,t2)
t3 <- 3 * g[,1] + g[,2]

【讨论】:

  • 这仍在循环中,它只是隐藏在 apply() 调用中。更快的是使用你的g,然后只做t3 &lt;- 3 * g[,1] + g[,2]
【解决方案2】:

与 John Coleman 的回答类似,outer() 是这样的好功能。

## if you want 3 * (t1 +t2)
t3a <- as.vector(outer(t1, t2, `+`)) * 3

g <- expand.grid(t1,t2)
t3b <- 3 * (g[,1] + g[,2])

## if you want 3 * (t1 +t2)
t4a <- as.vector(outer(3*t1, t2, `+`))

g <- expand.grid(t1,t2)
t4b <- 3 * g[,1] + g[,2]

产生与约翰的答案相同的输出。

> all.equal(t3a, t3b)
[1] TRUE
> all.equal(t4a, t4b)
[1] TRUE

outer() 似乎要快一些,即使在这个小例子上也是如此,大概是因为它适用于矩阵,而 expand.grid() 必须形成一个数据框。

【讨论】:

    【解决方案3】:

    可能是这样的:

    t1 <- seq(50, 150, 0.5) # 200x1 vector
    t2 <- seq(0, 1, 0.005)  # 200x1 vector
    t3 <- vector(mode="numeric", length=length(t1)*length(t2))
    k <- 0
    for (i in t1) {
       for (j in t2) {
           t3[k]=3*i+j
           k <- k+1
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      • 2021-01-21
      • 1970-01-01
      • 2015-01-11
      相关资源
      最近更新 更多