Jak losować wektor

81

Chciałbym losowo zmienić kolejność liczb w wektorze za pomocą prostego jednowierszowego polecenia?

Mój konkretny wektor V ma 150 wpisów dla każdej wartości od 1 do 10:

V <- rep(1:10, each=150)
user1723765
źródło
9
Odpowiedzi tutaj słusznie wskazują ci kierunek sample. Możesz sprawdzić ostrzeżenia tutaj, aby dowiedzieć się, jakie niebezpieczeństwa wiążą się z używaniem próbki w takiej postaci, w jakiej jest.
Dason
@Dason: tl; dr jest tak długi, jak długość wektora jest> 1, działa.
smci
1
@smci The tl; Dr jest takie, że jest to niebezpieczne, ponieważ czujesz się z nim komfortowo, a gdy w końcu ma długość 1, gryzie cię.
Dason
@Dason Czytałem to, ale nikt nie jest jeszcze zmodyfikowany, base::sampleaby wymusić użycie seq_along. Poza tym i tak nie widzę, gdzie sample/sample.intzadzwonić base::seq()?
smci

Odpowiedzi:

124

Tak.

sample(V)

Od ?sample:

Dla „próbki” wartością domyślną „size” jest liczba elementów wywnioskowana z pierwszego argumentu, tak że „próbka (x)” generuje losową permutację elementów „x” (lub „1: x”).

Ben Bolker
źródło
Jak mogę tasować [1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5] tak, że otrzymam coś takiego: [5, 5, 3, 3, 3, 3, 1, 1, 2, 4, 4, 4]? tak, że każdy element może losowo zmienić się na inny, ale z zachowaniem stałej liczby każdego elementu?
Rotail
2
@Rotail: to już robi to, co chcesz; sizeargument sampledomyślnych do size <- length(x). (Wpisz, sampleaby zobaczyć kod, który to robi.)
smci
tak! Dziękuję Ci!
Rotail
24

Użyj samplefunkcji

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

set.seed(001) # just to make it reproducible
sample(V)
Jilber Urbina
źródło
1
replace=FALSEjest wartością domyślną.
Ben Bolker,
daje to 150 wartości z oryginalnego 1500
user1723765