2013-01-31 28 views
40

पर आधारित आर डेटाटेबल पंक्तियों का चयन कैसे करें मेरे पास एक चरित्र कॉलम के साथ एक डेटाटेबल है, और केवल उन पंक्तियों का चयन करना चाहते हैं जिनमें एक सबस्ट्रिंग है। एसक्यूएल WHERE x LIKE '%substring%'सबस्ट्रिंग मैच (ला ला एसक्यूएल जैसे)

E.g. के बराबर

> Months = data.table(Name = month.name, Number = 1:12) 
> Months["mb" %in% Name] 
Empty data.table (0 rows) of 2 cols: Name,Number 

मैं केवल पंक्तियों का चयन कैसे करूं जहां नाम "एमबी" है?

उत्तर

72

data.table एक like कार्य है पंक्तियों सबसेट होते हैं।

Months[like(Name,"mb")] 
     Name Number 
1: September  9 
2: November  11 
3: December  12 

या, %like% लग रहा है अच्छा:

> Months[Name %like% "mb"] 
    Name Number 
1: September  9 
2: November  11 
3: December  12 

ध्यान दें कि %like% और like() उपयोग grepl (तार्किक वेक्टर देता है) के बजाय grep (रिटर्न पूर्णांक स्थानों पर)। यही कारण है कि तो यह अन्य तार्किक शर्तों के साथ जोड़ा जा सकता है है:

> Months[Number<12 & Name %like% "mb"] 
     Name Number 
1: September  9 
2: November  11 

और तुम भी नियमित अभिव्यक्ति खोज की शक्ति मिल (न सिर्फ% या * वाइल्डकार्ड),।

+0

इस कमांड का उपयोग करने और '<-' के बिना तालिका को अपडेट करने का कोई तरीका है, मैं कुछ महीनों [नाम == जैसे (नाम, "एमबी"),] ' –

+0

@ राफेल पेरेरा में कुछ सोच रहा था, क्या आपने' ? data.table' (उदाहरण), प्रलेखन पढ़ें और डेटाकंप कोर्स लिया? 'महीनों [जैसे (नाम," एमबी "), कुछ कॉल: = कुछ वैल्यू]' –

+0

@ मैट-डॉउल के सुझावों के लिए धन्यवाद। शायद मैं पर्याप्त स्पष्ट नहीं था। [मैं आपको यह पूछना चाहता था] (http://stackoverflow.com/questions/32882768/subset-data-table-without-using)। –

7

ऑपरेटर %in% यह खोजने के लिए प्रयोग किया जाता है मिलान करता है, तो मान मूल्यों का एक और सेट में मौजूद आंशिक स्ट्रिंग नहीं करता है अर्थात "a" %in% c("a","b","c")

मिलान आप grep() समारोह उपयोग करने की आवश्यकता आंशिक स्ट्रिंग ऐसा करने के लिए। आप "mb" के साथ सभी कॉलमों की अनुक्रमणिका लौटने के लिए grep का उपयोग कर सकते हैं। फिर उस सूचकांक

Months[grep("mb", Name)] # data.table syntax slightly easier 
+2

ग्रेट धन्यवाद, वास्तव में 'महीनों [grep ("mb", name)]' काम करने लगता है। – Corone

+0

यह केवल तभी काम करना चाहिए जब आपने नाम को अपने कार्यक्षेत्र में कहीं और अलग वेक्टर के रूप में परिभाषित किया हो। सावधान रहें कि आप किस चर का उपयोग कर रहे हैं – LostLin

+1

क्या यह सिर्फ काम नहीं कर रहा है क्योंकि यह डेटा.table बनाम डेटा.फ्रेम है? – Corone