Групповые совпадающие числа в случайном порядке в R

Я работаю над проблемой типа моделирования Монте-Карло, и мне нужно создать вектор повторяющихся случайных чисел с совпадающими числами, сгруппированными вместе, но в случайном порядке.

Легче объяснить на примере. Если бы у меня было: 1, 3, 7, 12, 1, 3, 7, 12, 1, 3, 7, 12

Я бы хотел, чтобы он отсортировался как: 7, 7, 7, 3, 3, 3, 12, 12, 12, 1, 1, 1 (или с группами совпадающих чисел в любом порядке, кроме возрастания/убывания).

Причина, по которой мне нужен случайный порядок, заключается в том, что моя симуляция MC предназначена для двух переменных, поэтому, если обе в порядке, они не будут меняться независимо.

У меня есть:

sort(rep(runif(50,1,10),10), decreasing = FALSE)

Который генерирует 50 случайных чисел от 1 до 10, повторяется каждые 10 раз, затем сортирует 50 групп из 10 совпадающих случайных чисел в порядке возрастания (или это может быть легко в порядке убывания, если я изменил «ЛОЖЬ» на «ИСТИНА»). Я просто не могу понять последний шаг получения 50 групп из 10 совпадающих чисел в случайном порядке. Кто-нибудь может помочь?


person TimM    schedule 16.03.2018    source источник
comment
Как насчет того, чтобы одна переменная располагалась в порядке возрастания, а другая — в случайном порядке, а затем просто группировались по обеим переменным при получении сводки?   -  person hpesoj626    schedule 16.03.2018
comment
Что значит по возрастанию по убыванию?   -  person Onyambu    schedule 16.03.2018
comment
@hpsejo626 - да, я думаю, все будет хорошо. На мой взгляд, не должно иметь значения, упорядочены ли обе переменные случайным образом или одна случайная, одна по возрастанию/убыванию. Пока они независимы.   -  person TimM    schedule 16.03.2018
comment
@Onyambu - под «по возрастанию / по убыванию» я имею в виду, что я не хочу получить 1, 1, 1, 3, 3, 3 ... или 12, 12, 12, 7, 7, 7, .. ... Я не был на 100% уверен, как воспроизвести ваши решения (хотя они кажутся очень похожими на решения akrun). Не стесняйтесь публиковать более подробную версию, если вас это беспокоит.   -  person TimM    schedule 16.03.2018
comment
Я опубликовал это до того, как akrun опубликовал решение. Посмотрите на время...   -  person Onyambu    schedule 16.03.2018
comment
Я предполагаю, что вы хотите сказать, что это не случайно ... потому что 3 не может следовать за 1, ни 7 не может следовать за 3, ни 12 не могут следовать за 7 ... ни 1 не может следовать за 3, ни 3 не может следовать за 7 и т. д. это означает, что вам придется ЗАКАЗАТЬ свои данные а не ПРОБОВАТЬ ИХ.Л. Вы упорядочиваете их таким образом, чтобы они не следовали друг за другом   -  person Onyambu    schedule 16.03.2018
comment
Ха-ха, не увидел временную метку, извините. Вернулся на работу на неделю и попробовал ваши решения. Оба работают хорошо, спасибо! Чтобы уточнить ваш последний комментарий, все в порядке, если некоторые числа в конечном итоге упорядочены последовательно из-за случайности, мне просто нужно избегать их систематического порядка. (Почему это так сложно объяснить!?!) В любом случае спасибо за помощь!   -  person TimM    schedule 18.03.2018


Ответы (2)


Вот один вариант с split

unlist(sample(split(v1, v1)), use.names = FALSE)
#[1]  3  3  3  1  1  1 12 12 12  7  7  7

Или еще вариант match с unique

v1[order(match(v1, sample(unique(v1))))]

данные

v1 <- c(1, 3, 7, 12, 1, 3, 7, 12, 1, 3, 7, 12)
person akrun    schedule 16.03.2018
comment
Спасибо! Похоже, что версия match/unique делает именно то, что мне нужно. Unlist всегда возвращает переменные в одном и том же порядке для меня, что не является основным, но, похоже, предполагает, что это не совсем случайно. - person TimM; 16.03.2018
comment
@TimM Я обернул sample на list, то есть sample(split(v1, v1)). Возможно вы это заметили или нет - person akrun; 16.03.2018
comment
Оба варианта мне подошли. Очень аккуратные решения. - person MKR; 16.03.2018
comment
@akrun - вернулся к работе на неделю и снова попробовал первое решение. На этот раз работал нормально. Не знаю, что я сделал не так в прошлый раз. Я проверял это только 3 или 4 раза, так что, возможно, мне просто не повезло. Спасибо за вашу помощь в любом случае. Я продвигаюсь вперед с вашим решением, и оно работает. - person TimM; 18.03.2018

Вариант может быть таким:

v <- c(1, 3, 7, 12, 1, 3, 7, 12, 1, 3, 7, 12)
lst <- split(v, unique(v))

sapply(sample(seq(length(lst)),length(lst)), function(i)lst[[i]])

#     [,1] [,2] [,3] [,4]
#[1,]    3   12    7    1
#[2,]    3   12    7    1
#[3,]    3   12    7    1

#OR for having just a vector 

as.vector(sapply(sample(seq(length(lst)),length(lst)), function(i)lst[[i]]))
#[1]  3  3  3 12 12 12  7  7  7 1  1  1
person MKR    schedule 16.03.2018