Создайте вектор различной последовательности, повторяемый с помощью runif и rnorm - PullRequest
0 голосов
/ 22 апреля 2020

Я хочу сделать что-то вроде:

vector <-  c(runif(3),rnorm(1), runif(3), rnorm(1)) 

Я пробовал:

vector <- rep( c(runif(3), rnorm(1) ), times = 2) )

Но проблема в том, что это два раза в одной последовательности.

Если вы можете помочь мне, пожалуйста.

Хорошего дня

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Это именно то, для чего предназначен replicate.
Со страницы help('replicate') (мой акцент):

replicate - это оболочка для общего использования sapply для повторной оценки выражения (которое обычно включает генерацию случайных чисел ).

set.seed(1234)
vector <-  replicate(2, c(runif(3),rnorm(1)))
vector
#          [,1]        [,2]
#[1,] 0.1137034 0.640310605
#[2,] 0.6222994 0.009495756
#[3,] 0.6092747 0.232550506
#[4,] 0.3143686 0.429124689

Редактировать

После объяснение в этом комментарии , я полагаю, что следующее ближе к тому, о чем просит вопрос. Обратите внимание, что каждая матрица 2x2 имеет элементы в предыдущем выводе в правильном порядке.

set.seed(1234)
W <- array(dim = c(2, 2, 2))
W[] <- replicate(2, c(runif(3), rnorm(1)))
W
#, , 1
#
#          [,1]      [,2]
#[1,] 0.1137034 0.6092747
#[2,] 0.6222994 0.3143686
#
#, , 2
#
#            [,1]      [,2]
#[1,] 0.640310605 0.2325505
#[2,] 0.009495756 0.4291247
1 голос
/ 22 апреля 2020

Вы можете сделать это, заполнив сначала объявление полного вектора, а затем сразу заполняя индексы для каждого распределения:

out_length = 4L * 2L
# every fourth element will come from rnorm; the rest from runif
norm_idx = seq(4L, out_length, by = 4L)
n_norm = length(norm_idx)

# declare output
out = numeric(out_length)
out[norm_idx] = rnorm(n_norm)
out[-norm_idx] = runif(out_length - n_norm)

В качестве альтернативы, вот хитрый способ выполнить sh, используя индексирование матрицы:

set.seed(394839)
m = matrix(0, nrow = 4L, ncol = 2L)

m[1:3, ] = runif(3L * ncol(m))
m[4L,  ] = rnorm(ncol(m))

c(m)
# [1]  0.4478556  0.1336022  0.5860134 -0.1626707  0.7055598  0.7631879  0.3132743  1.5485366

в R, матрицы - это просто векторы с измерениями, и они заполняют столбец за столбцом - следовательно, мы можем объявить эту матрицу:

#       [,1] [,2] [,3] [,4] [,5]
# [1,]    1    3    5    7    9
# [2,]    2    4    6    8   10

следующим образом :

matrix(1:10, nrow = 2L, ncol = 5L)

Имея это в виду, мы можем скопировать ваш шаблон 3-1-3-1, сделав 3-1 шаблоном в каждом столбце.

Вы можете подтвердить, что он работает путем увеличения (так, чтобы небольшие эффекты семпла были приглушены):

...