2013-07-09 19 views
0

我使用另一個變量block創建一個向量(使用sample()函數)的隨機置換,以便爲其他塊中的每個唯一元素進行隨機置換。但是,當塊中的唯一元素變大時,數量排列大小會發生變化。我不確定unlist()函數是否正在創建空間分隔符,或者爲什麼會發生這種情況。請參閱下面的示例代碼;使用block1的排列的維數是原始變量的長度,但是block2的長度更長。我對代碼爲什麼這樣做了目瞪口呆;有什麼想法嗎?unlist在R中創建附加值

x <- sample(1:3, 250, replace = TRUE) 
block1 <- sample(1:20, 250, replace = TRUE) 
block2 <- sample(1:100, 250, replace = TRUE) 

block_permutation = function(x, block) unlist(as.vector(sapply(unique(block), function(j) sample(x[block==j])))) 

perm1<- sapply(1:2, function(i) block_permutation(x, block1)) 
perm2<- sapply(1:2, function(i) block_permutation(x, block2)) 

dim(perm1) 
dim(perm2) 
+0

此代碼看起來複雜得多,它必須是。你能否提供一些更清晰的信息來說明你想要置換的內容?爲了什麼目的? – Thomas

回答

0

如果我正確理解你的代碼,那麼你的問題是,sample(5)實際上意味着sample.int(5)和相同sample(1:5, 5)。因此,當x[block == j]產生單個數字時,您不是從單個數字序列中抽樣。

亞倫指出,這是在?sample記錄,你應該在你的block_permutation使用此功能,而不是sample

resample <- function(x, ...) x[sample.int(length(x), ...)] 

此外,as.vector是不必要的。

+1

對於這個問題,請參閱'sample'文檔中討論的'resample',並在這個答案中:http://stackoverflow.com/a/7548080/210673 – Aaron

1

@eddi回答了您關於這種情況發生的原因的問題。但是,您正在使用的代碼是可行的。看起來很簡單的任務很複雜。考慮使用以下來執行你的排列。

perm1 <- replicate(2, unlist(lapply(split(x,block1), sample))) 
perm2 <- replicate(2, unlist(lapply(split(x,block2), sample))) 

> dim(perm1) 
[1] 250 2 
> dim(perm2) 
[1] 272 2 

而且,隨着@ EDDI的功能:

perm1 <- replicate(2, unlist(lapply(split(x,block1), resample))) 
perm2 <- replicate(2, unlist(lapply(split(x,block2), resample))) 

> dim(perm1) 
[1] 250 2 
> dim(perm2) 
[1] 250 2