Выбрать случайный элемент в списке R? - PullRequest
57 голосов
/ 22 февраля 2012
a<-c(1,2,0,7,5)

В некоторых языках есть функция выбора - выберите одно случайное число из a - как в R?

Ответы [ 6 ]

73 голосов
/ 22 февраля 2012
# Sample from the vector 'a' 1 element.
sample(a, 1)
21 голосов
/ 22 февраля 2012

вышеуказанные ответы технически правильны:

sample(a,1)

однако, если вы хотите повторить этот процесс много раз, скажем, вы хотите имитировать бросание кубика, то вам нужно добавить:

a<-c(1,2,3,4,5,6)
sample(a, 12, replace=TRUE)

Надеюсь, это поможет.

12 голосов
/ 26 декабря 2014

Будьте осторожны при использовании образца!

sample(a, 1) отлично работает для вектора в вашем примере, но если вектор имеет длину 1, это может привести к нежелательному поведению, он будет использовать вектор 1:a для выборки.

Так что, если вы пытаетесь выбрать случайный элемент из вектора различной длины, проверьте случай длины 1!

sampleWithoutSurprises <- function(x) {
  if (length(x) <= 1) {
    return(x)
  } else {
    return(sample(x,1))
  }
}
4 голосов
/ 22 февраля 2012

Читать эта статья о генерации случайных чисел в R.

http://blog.revolutionanalytics.com/2009/02/how-to-choose-a-random-number-in-r.html

В этом случае вы можете использовать sample

sample(a, 1)

Второй атрибут показывает, что вы хотите получить только одно случайное число.Для генерации числа между некоторым диапазоном runif полезна функция.

3 голосов
/ 08 декабря 2017

Этот метод не выдает ошибку, если ваш вектор имеет длину один, и он прост.

a[sample(1:length(a),1)]
1 голос
/ 29 мая 2017

Альтернативой является выбор элемента из вектора с использованием runif.т.е.

a <- c(1,2,0,7,5)
a[runif(1,1,6)]

Допустим, вам нужна функция, которая выбирает ее каждый раз при запуске (полезно, например, в симуляции).Так что

a <- c(1,2,0,7,5)
sample_fun_a <- function() sample(a, 1)
runif_fun_a <- function() a[runif(1,1,6)]
microbenchmark::microbenchmark(sample_fun_a(), 
                           runif_fun_a(),
                           times = 100000L)

Единица: наносекунды

sample_fun_a () - 4665

runif_fun_a () - 1400

runif в этом примере выглядит быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...