0

我正在通过另一个变量块创建向量的随机排列(使用 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)
4

2 回答 2

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
于 2013-07-09T20:53:19.817 回答
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是不必要的。

于 2013-07-09T20:41:30.373 回答