【问题标题】:Group matching numbers in random order in R在R中以随机顺序对匹配数字进行分组
【发布时间】:2018-03-16 05:47:27
【问题描述】:

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

用一个例子更容易解释。如果我有: 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 模拟是针对 2 个变量的,所以如果两个变量都按顺序排列,它们就不会独立变化。

我已经知道了:

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

生成 50 个介于 1 和 10 之间的随机数,每重复 10 次,然后按升序对 50 组 10 个匹配的随机数进行排序(或者如果我将“FALSE”更改为“TRUE”,则很容易降序) .我只是想不出以随机顺序获得 50 组 10 个匹配数字的最后一步。有人可以帮忙吗?

【问题讨论】:

  • 如何让一个变量按递增顺序,另一个按随机顺序,然后在获取摘要时按两个变量分组?
  • 升序降序是什么意思?
  • y=by(x,x,FUN=I); unlist(y[sample(length(y),length(y))])
  • unlist((a<-split(x,x))[sample(b<-length(a),b)])
  • @hpsejo626 - 是的,我认为这很好。在我的脑海中,两个变量是随机排序还是一个随机,一个升序/降序都无关紧要。只要他们是独立的。

标签: r sorting random montecarlo


【解决方案1】:

这是split的一个选项

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

或者另一个选项是matchunique

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

数据

v1 <- c(1, 3, 7, 12, 1, 3, 7, 12, 1, 3, 7, 12)

【讨论】:

  • 谢谢!匹配/独特的版本似乎完全符合我的要求。 unlist 总是以相同的顺序为我返回变量,这不是主要的,但似乎表明它不是正确随机的。
  • @TimM 我在list 上用sample 包裹,即sample(split(v1, v1))。也许你注意到了,或者没有
  • 这两个选项都对我有用。非常简洁的解决方案。
  • @akrun - 回到工作一周并再次尝试第一个解决方案。这次工作得很好。不知道我上次做错了什么。我只测试了 3 或 4 次,所以也许我只是运气不好得到了相同的序列。还是要谢谢你的帮助。我正在推进你的解决方案,它很有效。
【解决方案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

【讨论】:

    猜你喜欢
    • 2021-04-13
    • 2020-08-24
    • 2014-12-20
    • 2015-10-21
    • 2012-11-19
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多