簡體   English   中英

R隨機選擇一個組合

[英]R Randomly select a combination

假設我有一個向量x ,其中包含10個數字。 我想選擇N次M次子集並將其放入列表對象。 如何確保我選擇的內容與列表中的所有元素都是唯一的? 注意順序無關緊要。 因此c(1,0,3)c(3,0,1)相同。

x = seq(1,10,1)

我可以使用combn(x,N)來做到這一點,但是在我的x包含10k或更多元素的情況下,使用combn並隨機選擇其中的任何一個都不可行。

或者說問題。 我想在不進行替換的情況下隨機采樣combn(x,N)的輸出。 是否可以不先生成調用combn

有任何想法嗎?

我想在不進行替換的情況下隨機采樣combn(x,N)的輸出。 是否可以不先生成調用combn?

我不這么認為,不是具有32位整數的當前狀態(而bit64甚至bit64不錯,也無法捕獲所有內容)。

combn(10000,4) :為了能夠任意索引combn(10000,4)返回的combn(10000,4) ,您可能首先要確定一些簡單明了的東西,例如“是我四個數字中的第一個為'1'”。 明知第一j組合產生的迭代將用1(例如,啟動1,2,3,41,2,3,5 ,......, 1,2,3,10000 ),你認為“所有我需要做的是對照第一組1檢查我想要的索引並進行迭代”(尋找2、3等)。 不幸的是,在10k和N=5 ,前4.162501e+14行以“ 1”開頭。 (這恰好是choose(10000-1,5-1) ,這不是巧合。)然后,您必須一次又一次地執行此操作,並且計數會增加。

這遠遠超出了32位整數空間。 N=68.320840e+17作為第一組1 8.320840e+17

要在此空間上執行“隨機訪問”是相當瘋狂的,甚至(我懷疑)本機64位計算也將很快耗盡空間。

如果無法減少數據量

我相信您最實用的方法是在他的評論中使用@alistaire的建議代碼:

set.seed(42)
x <- seq(1, 10000)
N <- 4
M <- 10
out <- list()
while(length(out) < M) {
  out <- c(out,
           unique(replicate(M - length(out), sort(sample(x, N)), simplify = FALSE)))
}
str(out)
# List of 10
#  $ : int [1:4] 2861 8302 9149 9370
#  $ : int [1:4] 1347 5191 6418 7365
#  $ : int [1:4] 4577 6570 7050 7189
#  $ : int [1:4] 2555 4623 9347 9398
#  $ : int [1:4] 1175 4750 5602 9783
#  $ : int [1:4] 1387 9041 9464 9887
#  $ : int [1:4] 825 3902 5142 9055
#  $ : int [1:4] 4470 7375 8109 8360
#  $ : int [1:4] 40 3882 6852 8327
#  $ : int [1:4] 74 2077 6116 9065

或稍作調整(如果使用更大的NM ,速度可能會提高約30%):

set.seed(42)
N <- 8
M <- 100
out <- list()
while (length(out) < M) {
  out2 <- split(apply(matrix(sample(lenx, size = M*N, replace = TRUE),
                            nrow = M, ncol = N),
                     1, sort),
                rep(1:M, each = N))
  out <- c(out, out2[ !duplicated(out2) ])
}

如果您知道M*N < length(x) ,那么可以改用replace=FALSE ,這樣就可以確保只通過一次while循環。

即使可以大大減少樣本量

我編寫了一個函數,提供了對組合的隨機訪問。 但是,我測試的次數越多,我越會發現它開始崩潰時,這樣做會不會確保索引的完全唯一性,也不會保證發生這種情況時會犯錯誤 (因此,我沒有發布它。如果有人真的很好奇,我可以脫機提供它。我對惰性的expand.grid做了類似的expand.grid ,但是從數學expand.grid這更簡單/易於處理;甚至到那時我都沒有用它進行測試設置得很大。由於您正在尋找組合而不是排列,因此我認為這不適合。)

底線:不幸的是,R可能不是這個地方。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM