2012-02-22 78 views
44
a<-c(1,2,0,7,5) 

某些語言具有選取功能 - 從a中選擇一個隨機數 - R怎麼樣?在R列表中選擇隨機元素?

+9

附註:您好像剛剛接觸R,應該只是閱讀一些介紹性材料。 http://stackoverflow.com/questions/420296/what-are-some-good-books-web-resources-and-projects-for-learning-r – Dason 2012-02-22 07:54:51

回答

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

小心樣品!如果'a'的長度爲1,則是數字(在is.numeric的意義上)並且'a'> = 1,則通過樣本的採樣從'1:a'發生。請注意,當'a'長度變化時,這種便利功能可能會導致不希望的行爲。 – pomber 2014-12-26 03:58:03

18

以上的答案是技術上是正確的:

sample(a,1) 

但是,如果你想重複這個過程多次,假設你想模仿扔骰子,那麼你就需要添加:

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

希望它有幫助。

9

使用樣品時要小心!

sample(a, 1)對你的例子中的矢量很好用,但是當矢量長度爲1時可能會導致不希望的行爲,它將使用矢量1:a進行採樣。

所以,如果你試圖從變長度的矢量中選擇一個隨機項目,檢查長度爲1的情況!

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

他們應該修復這個錯誤。 – skan 2017-12-08 19:54:47

1

另一種方法是選擇使用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似乎是在這個例子中更快。

0

當你的矢量長度爲1時,這種方法不會產生錯誤,而且很簡單。

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