2013-07-09 73 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