require(permute) ## load package
## data
dat <- data.frame(Sample = 1:8, Index = rep(1:4, each = 2),
CL = c(0,0,1,1,1,1,0,0))
Теперь нам нужен управляющий объект, который определяет, как должны быть расслоены перестановки. Для этого используйте permControl()
:
> ctrl <- with(dat, permControl(strata = Index))
> ctrl
No. of permutations: 199
**** STRATA ****
Permutations are stratified within: Index
Strata unpermuted
**** SAMPLES ****
Permutation type: free
Mirrored permutations for Samples?: No
Use same permutation within strata?: No
Далее мы генерируем перестановки, здесь я создаю набор из 10 перестановок индексов строк
> set.seed(10)
> perms <- shuffleSet(nrow(dat), nset = 10, control = ctrl)
> perms
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 2 1 3 4 5 6 7 8
[2,] 2 1 4 3 5 6 7 8
[3,] 1 2 3 4 6 5 8 7
[4,] 1 2 4 3 6 5 8 7
[5,] 1 2 3 4 6 5 8 7
[6,] 1 2 3 4 5 6 7 8
[7,] 1 2 3 4 5 6 7 8
[8,] 1 2 3 4 5 6 7 8
[9,] 2 1 4 3 5 6 7 8
[10,] 2 1 3 4 5 6 7 8
Строки perms
являются перестановками, а столбцы ссылаются на строки исходных данных.
Если вам нужна только одна перестановка за раз, например, когда вы используете цикл для проверки перестановки, используйте shuffle()
вместо shuffleSet()
, например:
> set.seed(10)
> perm <- shuffle(nrow(dat), control = ctrl)
> perm
[1] 2 1 3 4 5 6 7 8
Чтобы использовать набор случайных чисел perms
, просто внесите в индекс dat
:
> dat[perms[1, ], ]
Sample Index CL
1 1 1 0
2 2 1 0
4 4 2 1
3 3 2 1
5 5 3 1
6 6 3 1
8 8 4 0
7 7 4 0
> dat[perms[2, ], ]
Sample Index CL
1 1 1 0
2 2 1 0
3 3 2 1
4 4 2 1
5 5 3 1
6 6 3 1
7 7 4 0
8 8 4 0
> dat[perms[3, ], ]
Sample Index CL
2 2 1 0
1 1 1 0
3 3 2 1
4 4 2 1
6 6 3 1
5 5 3 1
7 7 4 0
8 8 4 0