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

anx*_*vez 3 random loops r sample generator

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

sample <- ceiling(runif(9, min=0, max=20))
Run Code Online (Sandbox Code Playgroud)

(这是圆形制服的一个例子,但它可以用普通,泊松或任何你想要的东西代替).

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

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
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

mat*_*fee 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)
Run Code Online (Sandbox Code Playgroud)

但是,有一种更简单的方法可以做到这一点.您不必dep逐行生成,可以通过制作包含9*N圆形均匀分布编号的向量来预先生成它:

dep <- ceiling(runif(9*N,min=0,max=20))
Run Code Online (Sandbox Code Playgroud)

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

dep <- matrix(dep,nrow=N)
Run Code Online (Sandbox Code Playgroud)

完成!

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

dep <- matrix( ceiling(runif(9*N,min=0,max=20)), nrow=N )
Run Code Online (Sandbox Code Playgroud)

如果你愿意,你可以叫data.framedep(在它已经投入了二维矩阵形式)得到的数据帧.


Tom*_*mmy 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
Run Code Online (Sandbox Code Playgroud)