Перемешать элементы вектора случайным образом
Пусть имеется вектор целых чисел от 1 до 100. Нам необходимо создать новый вектор, путем случайного перемешивания элементов исходного вектора.Это можно сделать с помощью конструкции:
# перемешивание shuffled vector
x = 1:100
x1 = sample(x)
sum(x) == sum(x1)
> # перемешивание shuffled vector > x = 1:100 > x1 = sample(x) > x1 [1] 97 94 98 83 73 66 68 3 30 51 59 26 52 90 95 21 25 24 88 [20] 31 41 81 75 9 91 50 86 20 39 60 92 23 56 10 35 99 11 79 [39] 19 100 7 1 34 69 74 53 77 40 44 61 76 28 63 96 78 58 85 [58] 47 18 43 67 62 80 87 70 82 2 42 46 71 72 48 27 36 38 84 [77] 89 13 64 55 93 4 45 54 22 5 37 29 16 6 32 14 12 15 49 [96] 8 65 17 57 33 > sum(x) == sum(x1) [1] TRUE |
# x = c(1,2,3,4,...100)
# Я хочу рандомизировать этот вектор "локально" на основе некоторого входного числа - "фактора локальности". Например, если коэффициент локальности равен 3, то берутся первые 3 элемента и рандомизируются, за которыми следуют следующие 3 элемента и так далее. Есть ли эффективный способ сделать это?
x <- 1:50
fact <- 5
y <- ceiling(length(x)/fact)
xx = unlist(lapply(split(x, rep(1:y, each =fact)[1:length(x)]), function(x){
if (length(x)==1) return(x)
sample(x)
}), use.names = FALSE)
j=1
for (k in 1:10) {
l = k*5
print(xx[j:l])
j=l
}
[1] 2 3 4 1 5 [1] 5 8 6 7 10 9 [1] 9 13 12 15 14 11 [1] 11 17 16 20 18 19 [1] 19 25 23 21 22 24 [1] 24 28 26 30 29 27 [1] 27 35 34 31 33 32 [1] 32 36 38 40 39 37 [1] 37 41 44 42 45 43 [1] 43 46 49 47 50 48 |