我正在尝试创建一个循环来创建一系列包含随机样本的对象,如下所示:
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]?
非常感谢,我希望你能理解我想要的东西。
答案 0 :(得分:6)
这是因为你已经使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)
然而,有一种更简单的方法可以做到这一点。您不必逐行生成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