如何创建一个循环来生成R中的随机样本列表?

时间:2012-03-22 23:53:39

标签: r loops random generator sample

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

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]?

非常感谢,我希望你能理解我想要的东西。

2 个答案:

答案 0 :(得分:6)

这是因为你已经使dep成为一个向量(默认情况下这些是1D),但是你试图在其中存储一个二维对象。

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

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 )

如果您愿意,可以在data.frame上调用dep(在将其放入2D矩阵表格后)以获取数据框。

答案 1 :(得分:6)

正如@ 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