[英]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.