2011-11-07 8 views
5

मेरे पास 10k पंक्तियों वाला डेटा फ्रेम है, किसी दिए गए कॉलम एक्स के लिए मेरे पास डुप्लिकेट मान हैं, हम इस कॉलम में केवल इस पंक्ति वाले यादृच्छिक रूप से केवल एक पंक्ति का चयन करने के लिए कैसे कर सकते हैं?अद्वितीय पंक्तियों के लिए यादृच्छिक रूप से डेटा फ्रेम पर चयन करें

उत्तर

6

आपका प्रश्न पूरी तरह से स्पष्ट नहीं है, लेकिन मुझे लगता है कि आप "डेटा डुप्लिकेट क्लास" प्रति एक (यादृच्छिक रूप से चुनी गई) पंक्ति को रखते हुए, संपूर्ण डेटा फ्रेम को कम करना चाहते हैं।

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

की तरह कुछ काम करना चाहिए (परीक्षण नहीं!)

+1

ओपी (क्रिप्टिक) प्रश्न की यह व्याख्या मेरे मुकाबले अधिक संभावना प्रतीत होती है, जिसके लिए मैं 'डीएफ [नमूना (जो (डीएफ $ एक्स == myVal), 1), सुझाव देने का सुझाव दे रहा था। – joran

+1

धन्यवाद दोस्तों, मैं बेन के सुझाव की कोशिश कर रहा हूं, जोरन, अगर मैं इसे सभी कॉलम मूल्य पर लागू करना चाहता हूं तो कैसे करें क्योंकि मेरे स्निपेट में सुझाए गए माईवल मेरे कॉलम एक्स के साथ बदलते हैं, जिसका अर्थ है कि मेरे पास उदाहरण के लिए सैकड़ों 5 हैं और सैकड़ों 8 एस आदि आदि – Rad

+0

@ रैड बेन का समाधान इसे संभालेगा; मेरा नहीं होगा हमने आपके प्रश्न को अलग तरीके से व्याख्या की। – joran

6

मेरी पहली वृत्ति बेन सुरुचिपूर्ण ddply समाधान की तरह कुछ हो गया होता। हालांकि, अब यह जानकर कि आपके पास इतना बड़ा डेटा सेट है, निश्चित रूप से तेज़ तरीके हैं।

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

कुछ डेटा (यहाँ कई अद्वितीय मूल्यों के साथ) अनुकरण:

> 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 तरीकों की तुलना करें यहाँ एक है कि कई गुना तेजी से अगर आप कई अद्वितीय मान हो जाएगा

+0

सुरुचिपूर्ण! बहुत बढ़िया, धन्यवाद जॉन – Rad

संबंधित मुद्दे