繁体   English   中英

R没有正确做样品

[英]R not doing samples properly

我试图以递增顺序生成范围(1-3)内的4个随机整数的向量v ,为此,我想出了这种方法:

v<-1:4
v[1]<-sample(1:3,1)
for (i in 2:4) v[i]<-sample(v[i-1]:3,1)

编辑:由于一直存在混淆,我要弄清楚我想要的向量是一个数学集合,所以我基本上想获得通过使用3个不同元素形成的基数为4的随机集合,必须)重复。

但是问题在于,像{1,1,1,1}这样的集合只有一种出现方式,而像{1,2,3,3}这样的集合可以以12种不同的方式出现(例如,在数学集合中,顺序无关紧要),因此出现其中一种的可能性会提高12倍。 我正在寻找一种随机获得其中一套的方法,所有这些套都具有相同的出现概率。 如果不是这个问题,我发布的内容应该可以使用

但是由于某种原因,它不起作用。 我发现,当到达范围的顶部时,它会混乱,并开始考虑范围内的所有整数都是可能的,而实际上只剩下一种可能性。

即,在我的特定问题中,当它达到3时,它应该正在执行:

sample(3:3,1)

应该总是导致3。相反,它似乎正在执行

sample(1:3,1)

有什么解决方法吗?

这有点笨拙,但是您可以定义一个替代样本函数,当将标量作为参数传递时,该函数不会默认为sample.int:

sample.alt = function(x) ifelse(length(x)>1, sample(x, 1), x)

并使用它而不是样本。

编辑:很高兴帮助@LMartin。 我必须早些时候参加一个研讨会,所以我没有使此功能完全可靠。 理想情况下,此函数应具有示例相同的所有选项。 不幸的是,ifelse返回的向量的长度与传递给它的逻辑参数的长度相同,这对于使用向量很方便,但是对于此问题而言并不理想:

> x = 1:10
> ifelse(length(x)>1, x, 0)
[1] 1

因此,我们只需要做很长一段路:

sample.alt = function(x, size, replace = FALSE, prob = NULL){
  if (length(x) > 1){
    sample(x, size, replace, prob)
  }
  else{
    rep(x, size)
  }
}

这是解决此问题的另一种方法。 简而言之,生成所有可能的有效序列,删除重复项,然后采样唯一序列集。

> set.seed(1)
> x <- unique(t(apply(expand.grid(1:3,1:3,1:3,1:3),1,sort)),MARGIN=1)
> x
      [,1] [,2] [,3] [,4]
 [1,]    1    1    1    1
 [2,]    1    1    1    2
 [3,]    1    1    1    3
 [4,]    1    1    2    2
 [5,]    1    1    2    3
 [6,]    1    1    3    3
 [7,]    1    2    2    2
 [8,]    1    2    2    3
 [9,]    1    2    3    3
[10,]    1    3    3    3
[11,]    2    2    2    2
[12,]    2    2    2    3
[13,]    2    2    3    3
[14,]    2    3    3    3
[15,]    3    3    3    3
> x[sample(1:nrow(x),1),]
[1] 1 1 2 2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM