我有一个向量x =(1,2,3,4,... 20),我想从这个向量生成带有5个元素的向量(元素可以重复),直到显示出所有元素第一个向量至少一次。然后我必须用直方图来表示数据。知道我该怎么办? 提前致谢
答案 0 :(得分:3)
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)
答案 1 :(得分:1)
我认为这就是你想要的:
x <- 1:20
s <- integer(0)
while (! all(x %in% s)) {
s <- c(s, sample(x, 5, TRUE))
}
向量s
将包含从x
中提取的所有值。我相信你可以自己制作直方图。
逐行说明:
x <- 1:20
- 使用数字1..20 x
s <- integer(0)
- 初始化将存储所有结果的空向量s
x %in% s
- 对于x
中的每个元素,检查它是否出现在s
中的任何位置并返回布尔(逻辑)值all(…)
- 如果参数向量中的所有元素都是TRUE
,则返回TRUE;否则返回FALSE(如果至少有一个不 TRUE)!
- 逻辑否定while
- 只要条件评估为TRUE,就会重复循环x
中至少有一个元素不在s
中,就可以在循环体中执行代码sample(x, 5, TRUE)
- 从向量x
中绘制五个元素,允许重复s <- c(s, sample(x, 5, TRUE))
- 将绘制的值连接到向量s
并将此新向量分配回s
答案 2 :(得分:0)
您可以通过替换获得五个元素的样本(如果您不想更换抽样,可以将其设置为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)