在R?列表中选择随机元素?


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

某些语言具有选择器功能-从中选择一个随机数a-R中的形式如何?


11
附带说明:您似乎是R的新手,应该应该阅读一些入门材料。 stackoverflow.com/questions/420296/...
达诚

另一方面:您提供的示例数据是向量,而不是列表。如果您想知道如何从列表中采样元素,可以在这里查看:statisticsglobe.com/select-random-element-from-list-in-r
Joachim Schork

Answers:


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

10
小心样品!如果a长度为1,则为数字(在is.numeric的意义上),且a> = 1,则从采样1:a。请注意,此便利功能在a长度变化时可能会导致不良行为。
庞贝2014年

R中是否有任何函数对值进行采样并将未选择的值保留为NA?

30

以上答案在技术上是正确的:

sample(a,1)

但是,如果您想重复此过程很多次,假设您要模仿掷骰子,那么您需要添加:

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

希望能帮助到你。


17

使用样品时要小心!

sample(a, 1)在您的示例中,该向量非常适合该向量,但是当向量的长度为1时,可能会导致不良行为,它将使用该向量1:a进行采样。

因此,如果您尝试从可变长度向量中选择随机项,请检查长度为1的情况!

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

他们应该修复此错误。
skan,


5

当向量的长度为一时,此方法不会产生错误,并且很简单。

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

2

另一种选择是使用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似乎更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.