2012-03-09 47 views
12

Có cách nào tốt để lấy mẫu hàng từ một phần của khung dữ liệu không?Mẫu ngẫu nhiên của các hàng từ tập hợp con của một khung dữ liệu R

Nếu tôi chỉ có dữ liệu như

gender <- c("F", "M", "M", "F", "F", "M", "F", "F") 
age <- c(23, 25, 27, 29, 31, 33, 35, 37) 

sau đó tôi có thể dễ dàng lấy mẫu trong độ tuổi từ ba trong số Fs với

sample(age[gender == "F"], 3) 

và nhận được một cái gì đó giống như

[1] 31 35 29 

nhưng nếu tôi chuyển dữ liệu này thành một khung dữ liệu

mydf <- data.frame(gender, age) 

tôi không thể sử dụng rõ ràng

sample(mydf[mydf$gender == "F", ], 3) 

mặc dù tôi có thể dựng lên một cái gì đó phức tạp với một số ngớ ngẩn của dấu ngoặc như

mydf[sample((1:nrow(mydf))[mydf$gender == "F"], 3), ] 

và nhận được những gì tôi muốn mà là một cái gì đó giống như

gender age 
7  F 35 
4  F 29 
1  F 23 

Có cách nào tốt hơn để tôi mất ít thời gian hơn để tìm hiểu cách viết không?

Trả lời

17

Cách phức tạp của bạn là khá nhiều cách để làm điều đó - Tôi nghĩ rằng tất cả các câu trả lời sẽ là biến thể về chủ đề đó.

Ví dụ, tôi thích để tạo ra mydf$gender=="F" chỉ số đầu tiên:

idx <- which(mydf$gender=="F") 

Sau đó, tôi lấy mẫu từ đó:

mydf[ sample(idx,3), ] 

Vì vậy, trong một dòng (mặc dù, bạn giảm số ngớ ngẩn của dấu ngoặc và có thể làm cho mã của bạn dễ hiểu hơn bằng cách có nhiều dòng):

mydf[ sample(which(mydf$gender=='F'), 3), ] 

Trong khi "wheee I'm a hacker!" một phần của tôi thích lót một, phần hợp lý của tôi nói rằng mặc dù hai lót là hai dòng, nó dễ hiểu hơn nhiều - nó chỉ là sự lựa chọn của bạn.

+0

6 dấu ngoặc đơn (dù trên một hoặc hai dòng) chắc chắn tốt hơn 10. – Henry

+0

Tôi vẫn không thể tin rằng không có cách nào dễ dàng để thực hiện quy trình thống kê đơn giản như vậy trong R. Có một ứng dụng, ý tôi là, một gói cho điều đó. –

9

Bạn nói tôi không thể sử dụng rõ ràng:

sample(mydf[mydf$gender == "F", ], 3) 

nhưng bạn có thể viết chức năng riêng của mình để thực hiện điều đó:

sample.df <- function(df, n) df[sample(nrow(df), n), , drop = FALSE] 

sau đó chạy nó trên lựa chọn tập hợp con của bạn:

sample.df(mydf[mydf$gender == "F", ], 3) 
# gender age 
# 5  F 31 
# 4  F 29 
# 1  F 23 

(Cá nhân tôi tìm thấy sample.df(subset(mydf, gender == "F"), 3) dễ dàng hơn đọc.)

2

này bây giờ đã đơn giản hơn với phiên bản nâng cao của sample trong gói của tôi:

library(devtools); install_github('kimisc', 'krlmlr') 

library(kimisc) 
sample.rows(subset(mydf, gender == "F"), 3) 

Xem thêm related answer này để xem chi tiết hơn.

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