Как рандомизировать вектор

81

Я хотел бы случайным образом изменить порядок чисел в векторе с помощью простой однострочной команды?

Мой конкретный вектор V имеет 150 записей для каждого значения от 1 до 10:

V <- rep(1:10, each=150)
user1723765
источник
9
Ответы здесь правильно указывают на вашу сторону sample. Возможно, вы захотите ознакомиться с предупреждениями здесь о некоторых опасностях, связанных с простым использованием образца как есть.
Дейсон 07
@Dason: tl; dr - до тех пор, пока длина вектора гарантированно будет> 1, это работает.
smci
1
@smci. tl; Dr заключается в том, что это опасно, потому что человек привыкает к нему, а затем, когда он наконец достигает длины 1, он вас кусает.
Дейсон
@Dason Я читал это, но никто еще не модифицировал его base::sampleдля принудительного использования seq_along. Также я все равно не вижу, куда sample/sample.intзвонить base::seq()?
smci

Ответы:

124

Да.

sample(V)

Откуда ?sample:

Для "выборки" по умолчанию "размер" - это количество элементов, выводимое из первого аргумента, так что "выборка (x)" генерирует случайную перестановку элементов "x" (или "1: x").

Бен Болкер
источник
Как я могу перемешать [1,1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5] так, чтобы получить что-то вроде этого: [5, 5, 3, 3, 3, 3, 1, 1, 2, 4, 4, 4]? таким образом, чтобы каждый элемент мог случайным образом изменяться на другой, но с сохранением числа каждого элемента постоянным?
Rotail,
2
@Rotail: это уже делает то, что вы хотите; sizeаргумент по sampleумолчанию в size <- length(x). (Введите, sampleчтобы увидеть код, который делает это.)
smci
Ага! Спасибо!
Rotail
24

sampleФункция использования

V<-rep(1:10, each=150)

set.seed(001) # just to make it reproducible
sample(V)
Джилбер Урбина
источник
1
replace=FALSEзначение по умолчанию.
Бен Болкер
это составляет 150 значений из исходных 1500
user1723765 07