【问题标题】:Saving each iteration of a repeat loop to a vector - R将重复循环的每次迭代保存到向量 - R
【发布时间】:2015-10-04 17:22:03
【问题描述】:

我查看了以前的帮助线程,但没有找到可以帮助我解决这个特定问题的内容。我知道 for 循环将是生成相同数据的更好方法,但我有兴趣通过重复循环(主要只是作为练习)来完成这项工作,并且正在努力解决这个问题。

所以我循环创建 100 个 rnorm 观察的 3 次迭代,每次将平均值从 5 更改为 25,再更改为 45。

i <- 1
repeat{
    x <- rnorm(100, mean = j, sd = 3)
    j <- 5*i 
    i <- i + 4
    if (j > 45) break
    cat(x, "\n",j, "\n")
}

我为每次迭代(总共 300 个值)获得组合保存输出的所有修补都失败了。救命!

【问题讨论】:

  • 您在重复之前没有定义您的j。 IE。 i &lt;- 1; j &lt;- 1; repeat { ...
  • 您不必在重复之前定义j,但您必须在将其用作rnorm 的参数之前定义它。
  • @LizzieSilver 是的,一般来说。但是,在这种情况下,最好在“重复”之前执行此操作。否则 mean 将始终是 j
  • @E.Go.: 如果@ccoxen 定义了j 如上所述,即j &lt;- 5*i,那么我看不到问题。
  • 真,即切换x &lt;- rnorm(...)j &lt;- 5*i的位置

标签: r loops


【解决方案1】:

你可以使用 lapply 来获得这个:

lapply(c(5,25,45), function(x){
  rnorm(100, mean = x, sd = 3)
  })

这将为您提供一个包含 3 个元素的列表: 每个包含 100 个从各自正态分布中提取的观测值。

【讨论】:

  • 正如您所展示的,其他循环是生成这些数据的更好方法。我只是对存储重复循环的每次迭代的方法感兴趣。感谢您的反馈!
【解决方案2】:

取决于你想要什么样的数据结构。 对于列表,它将是:

r = list()
repeat{

r[[length(r)+1]] = list(x,j)
}

那么:r[[1]][[1]] 将是 x for 1 循环,而 r[[1]][[2]] 将是 j。

【讨论】:

    【解决方案3】:

    由于您知道要存储多少观测值,因此您可以预先分配该大小的矩阵,并在生成数据时将其存储在其中。

    # preallocate the space for the values you want to store
    x <- matrix(nrow=100, ncol=3)
    
    # save the three means in a vector
    j_vals <- c(5,25,45)
    
    # if you really need a repeat loop you can do it like so:
    i <- 1
    repeat {
    
        # save the random sample in a column of the matrix x
        x[,i] <- rnorm(100, mean = j_vals[i], sd = 3)
    
        # print the random sample to the console (you can omit this)
        cat(x[,i], "\n",j_vals[i], "\n")
    
        i <- i+1
        if (i > 3) break
    }
    

    您应该得到一个矩阵x,其中随机样本存储在列中。您可以访问每一列,例如x[,1]x[,2] 等。

    【讨论】:

      猜你喜欢
      • 2018-02-13
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多