簡體   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