2012-12-21 28 views
12

Tôi có một vector có chiều dài khác nhau, đôi khi có thể có độ dài 1.Lấy mẫu trong R từ vectơ có độ dài khác nhau

Tôi muốn lấy mẫu từ vectơ này sao cho chiều dài của nó là 1 1 số.

Sample() sẽ không làm điều này vì nó mẫu từ 1 tới chữ số khi kích thước mẫu là 1.

+6

Câu trả lời cho câu hỏi này là tệp trợ giúp cho 'mẫu' xem'? Mẫu' và đọc kỹ phần 'Chi tiết', tại đây bạn có thể tìm thấy 'Nếu x có độ dài 1, là số (theo nghĩa là. số) và x> = 1, lấy mẫu qua mẫu diễn ra từ 1: x.' –

+2

và có cách nào os làm cho mẫu đó chỉ có giá trị duy nhất không? – user1723765

Trả lời

14

Đây là một tính năng ghi nhận:

Nếu x có chiều dài 1, là numeric (theo ý nghĩa của is.numeric) và x >= 1, lấy mẫu qua mẫu diễn ra từ 1:x. Lưu ý rằng tính năng tiện lợi này có thể dẫn đến hành vi không mong muốn khi x có độ dài thay đổi trong các cuộc gọi như sample(x).

Một cách khác là để viết chức năng riêng của bạn để tránh các tính năng:

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

Một số chức năng với hành vi tương tự được liệt kê dưới seq vs seq_along. When will using seq cause unintended results?

+0

Chúng tôi đã đăng cùng một câu trả lời cùng một lúc. Do đó tôi đã chuyển câu trả lời của tôi cho câu hỏi giống hệt khác và đã bỏ phiếu để sát nhập cả hai câu hỏi. –

+0

Cảm ơn @Joris. Tôi nghĩ rằng câu trả lời của tôi có nhiều hơn một chút so với của bạn vì vậy cảm thấy tự do để cứu hộ nếu bạn đồng ý. Tôi thà đóng cửa cái mới hơn nhưng tôi không biết nếu có một chính sách tại chỗ trong những trường hợp như vậy. – flodel

+1

Tôi đã upvoted bạn đã :). Tôi đã gắn cờ câu hỏi để hợp nhất, vì vậy khi điều đó xảy ra, tất cả các câu trả lời sẽ được thêm vào cùng nhau. Tôi có nghĩa là để đóng khác, nhưng dường như tôi nhấp vào "bỏ phiếu để đóng" trong cửa sổ sai. Lỗi của tôi xin lỗi. –

15

Khi ăn chỉ có một số duy nhất, sample công trình như sample.int (xem ?sample). Nếu bạn muốn chắc chắn rằng nó chỉ mẫu từ vector bạn cho nó, bạn có thể làm việc với các chỉ số và sử dụng cấu trúc này:

x[sample(length(x))] 

này mang đến cho bạn kết quả chính xác bất kể chiều dài của x, và mà không cần phải thêm an if điều kiện kiểm tra độ dài.

Ví dụ:

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) 

Lưu ý: bạn có thể thay sample bởi sample.int để có được một tăng tốc độ ít.

+3

+1 cho giải pháp thanh lịch nhất ở đây. – Thilo

Các vấn đề liên quan