Подтвердить что ты не робот

Выберите случайный элемент в списке R?

a<-c(1,2,0,7,5)

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

4b9b3361

Ответ 1

# Sample from the vector 'a' 1 element.
sample(a, 1)

Ответ 2

приведенные выше ответы являются технически правильными:

sample(a,1)

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

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

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

Ответ 3

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

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

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

sampleWithoutSurprises <- function(x) {
  if (length(x) <= 1) {
    return(x)
  } else {
    return(sample(x,1))
  }
}

Ответ 4

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

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

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

sample(a, 1)

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

Ответ 5

Альтернативой является выбор элемента из вектора с помощью 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, похоже, в этом примере быстрее.

Ответ 6

Этот метод не создает ошибку, когда ваш вектор является длиной один, и это просто.

a[sample(1:length(a),1)]