我在R中有下面的向量,把它们想象成一个数字的向量。
x = c(1,2,3,4,...100)我想根据一些输入数字“局部性因子”来“局部”地随机化这个向量。例如,如果位置因子是3,则取前3个元素并随机化,然后是接下来的3个元素,依此类推。有没有一种有效的方法来做到这一点?我知道如果我使用sample,它会使整个数组变得混乱。提前感谢
发布于 2013-07-14 23:21:43
一般解决方案:
编辑:正如@MatthewLundberg评论的那样,我指出的“在x中重复数字”的问题可以通过使用seq_along(x)轻松克服,这意味着结果值将是索引。所以,它应该是这样的:
k <- 3
x <- c(2,2,1, 1,3,4, 4,6,5, 3)
x.s <- seq_along(x)
y <- sample(x.s)
x[unlist(split(y, (match(y, x.s)-1) %/% k), use.names = FALSE)]
# [1] 2 2 1 3 4 1 4 5 6 3老生常谈:
这里的瓶颈是对函数sample的调用量。只要您的数字不重复,我认为您只需以这种方式调用一次sample就可以做到这一点:
k <- 3
x <- 1:20
y <- sample(x)
unlist(split(y, (match(y,x)-1) %/% k), use.names = FALSE)
# [1] 1 3 2 5 6 4 8 9 7 12 10 11 13 14 15 17 16 18 19 20将所有内容放在一个函数中(我喜欢@Roland‘s中的名称scramble ):
scramble <- function(x, k=3) {
x.s <- seq_along(x)
y.s <- sample(x.s)
idx <- unlist(split(y.s, (match(y.s, x.s)-1) %/% k), use.names = FALSE)
x[idx]
}
scramble(x, 3)
# [1] 2 1 2 3 4 1 5 4 6 3
scramble(x, 3)
# [1] 1 2 2 1 4 3 6 5 4 3要进一步简化答案(并更快地获得答案),请关注@flodel的评论:
scramble <- function(x, k=3L) {
x.s <- seq_along(x)
y.s <- sample(x.s)
x[unlist(split(x.s[y.s], (y.s-1) %/% k), use.names = FALSE)]
}https://stackoverflow.com/questions/17640617
复制相似问题