2013-03-01 57 views
2

在此站點上的人的幫助下,我有一個矩陣y,看起來與此類似(但更簡化)。 。R使用示例創建隨機數矩陣列

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)?

+0

對不起來樣,你似乎給我們留下了評論,並刪除了它。你能再寫一遍嗎?我明白我的答案似乎並不是你想要的。 – Arun 2013-03-01 18:54:05

回答

5

爲什麼發生這種情況:

的問題是,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

1

這應該得到你想要的東西:

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

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

+0

我很抱歉,但我不明白這一點。我在這裏也獲得了6個獨特的值。這和'sample(1:99999,6)'完全不同嗎? – Arun 2013-03-01 18:56:34

+0

利用提供的示例數據,唯一(y [,2])是c(3,1,2)。現在使用sapply,您首先從1:99999,然後是1個值,最後是2個值中採樣3個值。這些組中可以有相同的值,例如,如果您從1:10採樣並使用set.seed(1),則會得到c(3,4,5,10,3,9)。我同意代碼有點神祕,希望能夠解決這個問題。 – 2013-03-01 19:02:58

+0

這似乎有點牽強,試圖在範圍爲1:99999的組中重複取值並選取幾個值。但我明白你的觀點。 – Arun 2013-03-01 19:07:07

1

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

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 
+0

這似乎與Hemmo給出的相反。他似乎是在組內沒有重複和組間(可能)重複。 – Arun 2013-03-01 19:18:17