簡體   English   中英

R使用樣本創建具有隨機數的矩陣列

[英]R Using Sample to Create Column of Matrix with Random numbers

在此站點上的人們的幫助下,我得到了一個與此相似的矩陣y (但更為簡化)。

1,3
1,3
1,3
7,1
8,2
8,2

我創建了第三列,生成隨機數(不使用此代碼替換每個重復塊j=cbind(y,sample(1:99999,y[,2],replace=FALSE))

矩陣j看起來像這樣:

1,3,4520
1,3,7980
1,3,950
7,1,2
8,3,4520
8,3,7980
8,3,950

我如何獲得第三列的真正隨機數,以便對於每個重復行,即3,然后是1,然后2,我得到一個未在該重復部分內復制的隨機數( replace = FALSE )?

為什么會這樣:

問題在於sample命令結構為:

sample(vector of values, how many?, replace = FALSE or TRUE)

在這里,“多少?” 應該是一個值。 由於您提供了y的第二列的全部,因此它只選擇第一個值3 ,因此它表示為:

set.seed(45) # just for reproducibility
sample(1:99999, 3, replace = F)

對於此種子,值是:

# [1] 63337 31754 24092

而且由於您僅將3個值綁定到具有6行的矩陣,所以它“回收”了這些值(意味着,它以相同的順序重復了這些值)。 所以,你得到:

#      [,1] [,2]  [,3]
# [1,]    1    3 63337
# [2,]    1    3 31754
# [3,]    1    3 24092
# [4,]    7    1 63337
# [5,]    8    2 31754
# [6,]    8    2 24092

看到值重復。 對於你所展示的矩陣,我不知道7,1,2是如何發生的。 作為y[,2] = 3矩陣的第一個值。

您應該怎么做:

y <- cbind(y, sample(1:99999, nrow(y), replace = FALSE))

這要求sample生成nrow(y) = 6 (此處)值,而不進行替換。 這將生成長度為6的不同值,並將其綁定到矩陣y

這應該給您您想要的:

j <- cbind(y, unlist(sapply(unique(y[,2]), function(n) sample(1:99999, n))))

編輯:代碼中有錯誤。 當然需要unique功能。

沒有循環,我無法得到這個。 也許別人可以得到更優雅的解決方案。 對我來說,問題是在組內重復采樣而不重復組間采樣

ll <- split(dat, paste(dat$V1,dat$V2,sep=''))
ll.length <- by(dat, paste(dat$V1,dat$V2,sep=''),nrow)
z <- rep(0,nrow(dat))  

SET <- seq(1,100)  ## we can change 100 by 99999 for example
v =1
for (i in seq_along(ll)){
  SET <- SET[is.na(match(z,SET))]
  nn   <- nrow(ll[[i]]) 
  z[v:(v+nn-1)] <- sample(SET,nn,rep=TRUE) 
  v <- v+nn
}

 z
[1]  35  77  94 100  23  59

暫無
暫無

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

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