我正在研究蒙特卡罗模拟类型问题,需要生成重复随机数的向量,匹配的数字组合在一起,但是按随机顺序。
用一个例子来解释更容易。如果我有: 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个匹配数字的最后一步。有人可以帮忙吗?
答案 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