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]?
非常感谢,我希望你能理解我想要的东西.
这是因为你已经创建dep了一个向量(默认情况下这些是1D),但是你试图在其中存储一个二维对象.
您可以在循环中dep关闭NULL和rbind(行绑定)它.另外,请注意,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.frame上dep(在它已经投入了二维矩阵形式)得到的数据帧.
正如@ 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)