Как создать цикл для генерации списка случайных выборок в 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 3

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