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