【问题标题】:How to create a loop for generate a list of random samples in R?如何创建循环以在 R 中生成随机样本列表?
【发布时间】:2012-03-22 23:53:39
【问题描述】:

我正在尝试创建一个循环来创建一系列包含随机样本的对象,如下所示:

sample <- ceiling(runif(9, min=0, max=20))

(这是圆形制服的示例,但它可以替换为正常、泊松或任何您想要的)。

因此,我构建了一个循环来自动生成各种生成器,目的是将它们包含在数据框中。然后,我设计的循环是这样的:

N=50
dep=as.vector(N)
count=1
for (i in 1:N){
    dep[count] <- ceiling(runif(9, min=0, max=20))  
    count=count+1
}

但是没有用!对于每个 dep[i] 我只有一个数字,而不是九个列表。

我应该怎么做?如果我想将每个 dep[i] 包含在数据框中?

非常感谢,希望你明白我想要什么。

【问题讨论】:

    标签: r loops random generator sample


    【解决方案1】:

    这是因为您已将 dep 设为向量(默认为 1D),但您尝试在其中存储二维对象。

    您可以在循环中将dep 关闭为NULLrbind(行绑定)。另外,请注意,您可以使用i,而不是在循环中使用count

    dep <- NULL
    for (i in 1:N){
        dep <- rbind(dep,  ceiling(runif(9, min=0, max=20)))
    }
    # if you look at dep now it's a 2D matrix.
    # We'll convert to data frame
    dep <- as.data.frame(dep)
    

    不过,有一种更简单的方法可以做到这一点。您不必逐行生成dep,您可以预先生成它,方法是制作一个包含9*N 的四舍五入均匀分布数的向量:

    dep <- ceiling(runif(9*N,min=0,max=20))
    

    现在,dep 当前是一个长度为 9*N 的向量。让我们把它变成一个 Nx9 矩阵:

    dep <- matrix(dep,nrow=N)
    

    完成!

    所以你可以在一行中完成上面的所有代码:

    dep <- matrix( ceiling(runif(9*N,min=0,max=20)), nrow=N )
    

    如果您愿意,可以在dep 上调用data.frame(在将其放入二维矩阵形式之后)以获取数据框。

    【讨论】:

      【解决方案2】:

      正如@mathematical.coffee 解释的那样。而且,在您的情况下,runif,您可以改用sample。实际上sample.int 更可靠。 ...而且比在此处使用 runif 快约 3 倍):

      N <- 1000000
      system.time( dep <- matrix(sample.int(20, 9*N, replace=TRUE), N) )  # 0.16 secs
      range(dep) # 1 20
      
      system.time( dep <- matrix(ceiling(runif(9*N, min=0, max=20)), N) ) # 0.45 secs
      range(dep) # 1 20
      

      【讨论】:

      • 是的!这个简单的技巧工作得更快。也非常感谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-21
      • 2014-05-18
      • 1970-01-01
      • 2011-10-20
      相关资源
      最近更新 更多