R

时间:2018-03-16 05:47:28

标签: r sorting random montecarlo

我正在研究蒙特卡罗模拟类型问题,需要生成重复随机数的向量,匹配的数字组合在一起,但是按随机顺序。

用一个例子来解释更容易。如果我有: 1,3,7,12,1,3,7,12,1,3,7,12

我希望它排序为: 7,7,3,3,3,3,12,12,12,1,1,1(或任何顺序的匹配数字组,但上升/下降)。

我需要随机顺序的原因是因为我的MC模拟是针对2个变量的,所以如果它们都是有序的,它们就不会独立变化。

我到目前为止:

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

在1到10之间产生50个随机数,每次重复10次,然后按升序对50组10个匹配的随机数进行排序(如果我将“FALSE”更改为“TRUE”,则可以很容易地按降序排序) 。我无法弄清楚以随机顺序获得50组10个匹配数字的最后一步。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

以下是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)

答案 1 :(得分:2)

选项可以是:

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