【发布时间】:2017-08-02 11:29:11
【问题描述】:
我正在研究一种在 R 中有效地创建向量的混乱(以及相反的特定排列)的方法。 据我所见,没有可以做到这一点的基本功能,而且在 SO 上也没有太多关于它的内容。
一个明显的开始是sample,它创建了一个向量的排列。但是我需要这种排列没有固定点,因此是向量的紊乱。有关此主题的详细说明,请参阅 this Cross Validated post。
这是我的第一种方法:
derangr <- function(x){
while(TRUE){
xp <- sample(x)
if(sum(xp == x) == 0) break
}
return(xp)
}
所以在while 循环中,我正在检查向量x 和x 的给定排列之间是否存在一个固定点,称为xp。如果没有,我打破循环并返回向量。
结果显示,它运行良好:
> derangr(1:10)
[1] 4 5 6 10 7 2 1 9 3 8
> derangr(LETTERS)
[1] "C" "O" "L" "J" "A" "I" "Y" "M" "G" "T" "S" "R" "Z" "V" "N" "K" "D" "Q" "B" "H" "F" "E" "X" "W" "U" "P"
所以我想知道是否有更好的方法来做到这一点,可能用某种矢量化替代while。我还想关注可扩展性。
这是两个示例的microbenchmark:
library(microbenchmark)
> microbenchmark(derangr(1:10),times = 10000)
Unit: microseconds
expr min lq mean median uq max neval
derangr(1:10) 8.359 15.492 40.1807 28.3195 49.4435 6866.453 10000
> microbenchmark(derangr(LETTERS),times = 10000)
Unit: microseconds
expr min lq mean median uq max neval
derangr(LETTERS) 24.385 31.123 34.75819 32.4475 34.3225 10200.17 10000
同样的问题也适用于相反的情况,产生具有给定数量的固定点n的排列:
arrangr <- function(x,n){
while(TRUE){
xp <- sample(x)
if(sum(xp == x) == n) break
}
return(xp)
}
【问题讨论】:
-
向量中的某些值是否像在
rep(LETTERS, 2)中那样多次出现?如果是这样,第一个“A”是否会与第二个“A”等互换? -
我正在寻找一个通用的解决方案,所以你提出了一个很好的观点。我的函数假定唯一值。如果您有重复值,那么第一个“A”是否被第二个交换并不重要,只要没有元素(或相反
n)元素停留在它们之前的位置。
标签: r performance vector permutation