【问题标题】:Generate a random vector multiple times until a condition is complete多次生成随机向量,直到条件完成
【发布时间】:2016-01-03 16:37:34
【问题描述】:

我有一个向量 x=(1,2,3,4,...20),我想从这个向量中生成 5 个元素的向量(元素可以重复),直到显示所有元素第一个向量至少一次。然后我必须用直方图表示数据。知道我该怎么做吗? 提前致谢

【问题讨论】:

  • 可以使用?sample
  • 一个简单的while循环?
  • 是的,可以用样本来完成,但我无法设置停止while循环的条件
  • 我在下面的循环中提供了答案。

标签: r random vector


【解决方案1】:

while 循环似乎是一个很好的方法。该解决方案使用矩阵来捕获您的样本。每个样本为一行。如果您愿意,这样可以更轻松地对每个样本执行其他操作。

set.seed(123)  

base_v <- 1:20

#empty matrix to put samples in
mydat <- matrix(nrow=0,ncol=5)

while(!all(base_v %in% mydat)){
  mydat <- rbind(mydat, sample(base_v,size=5,replace=T))
}

#then making the histogram is trivial
hist(mydat)

【讨论】:

  • 我相信你的代码没问题,但是每个循环都必须捕获每个数字显示的次数,最后在直方图中显示所有数据,其中一个数字只会显示一次。这是停止循环的条件
  • 你测试了吗?我忘了在直方图中设置中断,但是如果您查看table(mydat),您会看到只有一个样本的数字。
【解决方案2】:

我想这就是你想要的:

x <- 1:20
s <- integer(0)
while (! all(x %in% s)) {
  s <- c(s, sample(x, 5, TRUE))
}

向量s 将包含从x 提取的所有值。我相信您将能够自己制作直方图。

逐行解释:

  • x &lt;- 1:20 - 用数字 1..20 初始化向量 x
  • s &lt;- integer(0) - 初始化空向量 s 将存储所有结果
  • x %in% s - 对于x 中的每个元素,检查它是否出现在s 中的任何位置并返回布尔(逻辑)值
  • all(…) - 如果参数向量中的所有元素都是 TRUE,则返回 TRUE;否则返回 FALSE(如果至少有一个是 TRUE)
  • ! - 逻辑否定
  • while - 只要条件评估为 TRUE,循环就会重复主体
  • 总结:只要x中的至少一个元素不在s中,就执行循环体中的代码
  • sample(x, 5, TRUE) - 从向量x 中绘制五个元素,允许重复
  • s &lt;- c(s, sample(x, 5, TRUE)) - 将绘制的值连接到向量 s 并将这个新向量分配回 s

【讨论】:

  • 这正是我所需要的
【解决方案3】:

您可以通过替换获得一个包含五个元素的样本(如果您不想替换采样,可以将其设置为 false):

x <- seq(1:20)
shown <- rep(0, 20)
while (!all(shown > 0)) {
  s <- sample(x, 5, replace = TRUE)
  shown[s] <- shown[s] + 1
}
hist(shown)

【讨论】:

  • 我修改了代码,每个循环都得到了一些直方图。有没有办法将结果组合在一个直方图中。我需要随机向量中每个变量的分布。这是代码: _ x
  • 但这不会保存样本。 OP 表示他们想要生成直方图。
  • @user3949008 看看上面的评论
  • 我稍作编辑以保存结果并绘制直方图。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多