Как создать цикл для генерации списка случайных выборок в R?
Я пытаюсь создать цикл, который создает серию объектов, содержащих случайную выборку, например:
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 ответа:
Это потому, что вы сделали
dep
вектор (по умолчанию это 1D), но вы пытаетесь сохранить в нем 2-мерный объект.Вы можете
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-матрицу), чтобы получить фрейм данных.
Как @математический.кофе объяснил. Но также, кажется, в вашем случае для
runif
, Вы можете использоватьsample
вместо этого. А на самом делеsample.int
надежнее. ...И примерно в 3 раза быстрее, чем с помощью runif здесь):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