2011-11-07 33 views

Trả lời

6

Câu hỏi của bạn không hoàn toàn rõ ràng, nhưng tôi giả sử bạn muốn subsample toàn bộ khung dữ liệu, giữ một hàng (được chọn ngẫu nhiên) cho mỗi "lớp trùng lặp". Một cái gì đó như

library(plyr) 
subsampled_data <- ddply(mydata,.(X), 
    function(x) { 
      x[sample(nrow(x),size=1),] 
    }) 

nên làm việc (chưa được thử nghiệm!)

+1

Giải thích về câu hỏi (khó hiểu) của OP dường như có nhiều khả năng hơn câu hỏi của tôi, mà tôi sẽ đề nghị 'df [mẫu (trong đó (df $ X == myVal), 1),]'. – joran

+1

Cảm ơn các bạn, tôi đang thử đề nghị của Ben, Joran, làm thế nào nếu tôi muốn áp dụng điều này cho tất cả giá trị colum vì myVal được đề xuất trong đoạn trích của bạn thay đổi dọc theo cột X của tôi, có nghĩa là tôi có hàng trăm ví dụ và hàng trăm 8s etc etc – Rad

+0

giải pháp @Rad Ben sẽ xử lý điều đó; của tôi sẽ không. Chúng tôi đã giải thích câu hỏi của bạn một cách khác nhau. – joran

6

bản năng đầu tiên của tôi sẽ là một cái gì đó giống như giải pháp thanh lịch ddply Ben. Tuy nhiên, khi biết rằng bạn có một tập dữ liệu lớn như vậy, chắc chắn có những cách nhanh hơn. Dưới đây là một trong đó sẽ có nhiều thời gian nhanh hơn nếu bạn có nhiều giá trị độc đáo:

RemoveDups <- function(df, column) { 
    inds = sample(1:nrow(df)) 
    df = df[inds, ] 

    dups = duplicated(df[, column]) 
    df = df[!dups, ] 
    inds = inds[!dups] 

    df[sort(inds, index=T)$ix, ] 
} 

Mô phỏng một số dữ liệu (ở đây với nhiều giá trị duy nhất):

n.row = 10^6 
n.col = 3 

set.seed(12345) 
data = data.frame(matrix(sample(1000, n.row*n.col, replace=T), nrow=n.row)) 

So sánh 2 phương pháp:

> system.time(ddply(data, 'X1', function(x) x[sample(nrow(x), size=1), ])) 
    user system elapsed 
    3.264 0.921 4.315 
> system.time(RemoveDups(data, 'X1')) 
    user system elapsed 
    0.375 0.025 0.399 
+0

Thanh lịch! Tuyệt vời, Cảm ơn John – Rad

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