2011-11-07 20 views

cevap

6

Sorunuz tamamen açık değil, ancak "yinelenen sınıf" başına bir (rasgele seçilen) satırı koruyarak tüm veri çerçevesini örneklemek istediğinizi varsayalım.

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

gibi bir şey (test edilmemiş!) çalışması yapılmalıdır

+1

OP'nin (şifreli) sorununun bu yorumu benim için daha muhtemel görünüyor, bunun için ben df [sample (hangisi (df $ X == myVal), 1),] 'yi önereceğim. – joran

+1

Teşekkürler, Ben'in önerisini deniyorum, Joran, bunu tüm sütun değerine uygulamak istersem nasıl yapmalıyım? Çünkü parçacıklarınızda önerilen myVal, X sütunum boyunca değişiyor, yani yüzlerce 5 örneğin yüzlerce 8s vs vs – Rad

+0

@Rad Ben'in çözümü; benimki olmaz. Sorunuzu farklı şekilde yorumladık. – joran

6

Benim ilk içgüdüsü Ben'in zarif ddply çözümü gibi bir şey olurdu. Ancak, artık böyle büyük bir veri setine sahip olduğunuzu bilmek, kesinlikle daha hızlı yollar var.

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, ] 
} 

(birçok benzersiz değerlere sahip burada) bazı verileri simüle:

> 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 
:

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)) 

2 yöntemler karşılaştırın İşte birçok kat daha hızlı birçok benzersiz değerler varsa olacak biridir

+0

Zarif! Harika, teşekkürler John – Rad

İlgili konular