我正在通过另一个变量block创建向量的随机排列(使用sample()函数),以便对另一个块中的每个唯一元素进行随机排列。然而,当块中的唯一元素变大时,数量排列大小改变。我不确定unlist()函数是否正在创建空间持有者或者为什么会发生这种情况。请参阅下面的示例代码;使用block1的排列的维数是原始变量的长度,但是对于block2来说它更长。我为什么代码这样做是傻眼的;有什么想法吗?
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 :(得分: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
答案 1 :(得分:0)
如果我正确理解了您的代码,那么您的问题是sample(5)
实际上意味着sample.int(5)
并且与sample(1:5, 5)
相同。因此,当x[block == j]
产生单个数字时,您不会从单个数字序列中采样。
正如Aaron指出的那样,?sample
中记录了这一点,您应该在sample
中使用此功能代替block_permutation
:
resample <- function(x, ...) x[sample.int(length(x), ...)]
此外,as.vector
是不必要的。