2012-12-21 84 views
12

的矢量I有具有不同長度的矢量,這有時可以是長度爲1採樣中的R從不同長度

我想從這個載體樣品,使得如果它的長度是1個它總是樣品那1號碼。當樣本大小是

樣品()將無法做到這一點,因爲它的樣品從1到數字1.

+6

這個問題的答案是'sample'的幫助文件,請參閱'sample'並仔細閱讀'Details'部分,在這裏您可以找到'If x長度爲1,是數字(在is的意義上。數字)和x> = 1,通過採樣採樣發生在1:x.' –

+2

,並有任何方式操作系統使它只採樣該單一值? – user1723765

回答

14

這是一個記錄特徵:

如果x具有長度1,是numeric (在is.numeric的意義上)和x >= 1,通過樣品採樣從1:x進行。請注意,如果在諸如sample(x)之類的調用中長度不一,則此便利功能可能會導致意外行爲。

另一種方法是寫自己的功能,避免功能:

sample.vec <- function(x, ...) x[sample(length(x), ...)] 
sample.vec(10) 
# [1] 10 
sample.vec(10, 3, replace = TRUE) 
# [1] 10 10 10 

有類似的行爲,某些功能受到seq vs seq_along. When will using seq cause unintended results?

+0

我們明顯在同一時刻發佈了相同的答案。因此,我將我的答案提到了另一個相同的問題,並投票決定將這兩個問題合併。 –

+0

謝謝@Joris。我認爲我的答案比你的答案多一點,所以如果你同意,可以隨時打撈。我寧願關閉較新的一個,但我不知道在這種情況下是否有一項政策。 – flodel

+1

我已經upvoted你:)。我標記了合併的問題,所以當這種情況發生時,所有的答案都加在一起。我打算關閉另一個,但顯然我在錯誤的窗口中點擊了「投票結束」。我的錯誤,對不起。 –

15

下上市的時候只喂一個單號,sample作品像sample.int (見?sample)。如果你想從你給它的載體確保它只有樣品,你可以使用索引工作,並使用此結構:

x[sample(length(x))] 

這給你正確的結果的x無論長度,而無需添加一個if -condition檢查長度。

例子:

mylist <- list(
    a = 5, 
    b = c(2,4), 
    d = integer(0) 
) 

mysample <- lapply(mylist,function(x) x[sample(length(x))]) 

> mysample 
$a 
[1] 5 

$b 
[1] 2 4 

$d 
integer(0) 

注意:您可以通過sample.int代替sample變得有點速度增益。

+3

+1是迄今爲止最優雅的解決方案。 – Thilo