Как создать цикл для генерации списка случайных выборок в R? - PullRequest
3 голосов
/ 23 марта 2012

Я пытаюсь создать цикл, который создает серию объектов, содержащих случайную выборку, например:

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] во фрейм данных?

Большое спасибо, надеюсь, вы понимаете, чего я хочу.

Ответы [ 2 ]

6 голосов
/ 23 марта 2012

Как объяснил @ математический кофе.Но, похоже, в вашем случае для 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
6 голосов
/ 23 марта 2012

Это потому, что вы сделали 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)

Готово! * * 1023

Таким образом, вы можете сделать весь свой код выше в одной строке:

dep <- matrix( ceiling(runif(9*N,min=0,max=20)), nrow=N )

Если вы хотите, вы можете позвонить data.frame на dep (после того, как он был переведен в форму 2D-матрицы), чтобы получить фрейм данных.

...