2012-03-09 15 views
12

के उप-समूह से पंक्तियों का यादृच्छिक नमूना डेटाफ्रेम के भाग से पंक्तियों का नमूना प्राप्त करने का कोई अच्छा तरीका है?आर डेटाफ्रेम

ऐसे

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

तो के रूप में मैं आसानी से

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

साथ Fs के तीन वर्ष की उम्र के नमूना और

[1] 31 35 29 

लेकिन जैसे कुछ प्राप्त कर सकते हैं मैं सिर्फ डेटा है, तो अगर मैं इस डेटा को डेटाफ्रेम

में बदलता हूं
mydf <- data.frame(gender, age) 

मैं स्पष्ट

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

उपयोग नहीं कर सकते हालांकि मैं तरह

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

कुछ कोष्ठक की एक बेतुका संख्या के साथ घुमावदार गढ़ना और जो मैं चाहता जो

gender age 
7  F 35 
4  F 29 
1  F 23 
की तरह कुछ है प्राप्त कर सकते हैं

क्या कोई बेहतर तरीका है जो मुझे लिखने के लिए कम समय लेता है?

उत्तर

17

आपका ठोस तरीका यह है कि यह कैसे करना है - मुझे लगता है कि सभी उत्तर उस विषय पर भिन्नताएं होंगे।

उदाहरण के लिए, मैं पहली बार mydf$gender=="F" सूचकांक उत्पन्न करने के लिए की तरह है:

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

तो मुझे लगता है कि से नमूना: तो एक पंक्ति में

mydf[ sample(idx,3), ] 

(हालांकि, आप कोष्ठक का बेतुका संख्या को कम और संभवतः एकाधिक कोड होने से आपके कोड को समझने में आसान बनाते हैं):

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

जबकि "wheee मैं एक हैकर हूँ!" मेरा हिस्सा एक लाइनर पसंद करता है, मेरे समझदार हिस्से का कहना है कि भले ही दो लाइनर दो लाइनें हों, यह बहुत अधिक समझ में आता है - यह सिर्फ आपकी पसंद है।

+0

6 ब्रैकेट्स (चाहे एक या दो लाइनों पर) निश्चित रूप से 10 से बेहतर है। – Henry

+0

मुझे अभी भी विश्वास नहीं है कि आर में ऐसी मजेदार कॉम्पैक्टिकल प्रक्रिया को चलाने का कोई आसान तरीका नहीं है। मेरा मतलब है, मेरा मतलब है, उसके लिए एक पैकेज। –

9

आप कहते हैं कि मैं स्पष्ट का उपयोग नहीं कर सकते हैं:

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

लेकिन आप इसे करने के लिए अपने स्वयं के समारोह लिख सकते हैं: तो

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

अपने सबसेट चयन पर चला:

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

(व्यक्तिगत रूप से मुझे sample.df(subset(mydf, gender == "F"), 3) आसान लगता है पढ़ने के लिए।)

2

यह अब मेरी पैकेज में sample का उन्नत संस्करण के साथ सरल है:

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

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

भी इस related answer देखें और अधिक विस्तार के लिए।

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