डेटाफ़्रेम फ़िल्टर करना


12

आर में अभी भी बुनियादी कार्य सीख रहे हैं, सबसेट फ़ंक्शन केवल एक शर्त के आधार पर एकल कॉलम के आधार पर या कई शर्तों के बिना फ़िल्टर करने के लिए लगता है?

मैं डेटाफ्रेम से डेटा को आसानी से कैसे फ़िल्टर कर सकता हूं?

  1. जब आपको कई शर्तों के साथ प्रदान किया जाता है

  2. जब उपलब्ध कॉलमों में इस शर्त को लागू करने की आवश्यकता होती है।

उदाहरण: एक डेटा फ्रेम युक्त

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

मैं इस डेटाफ्रेम को फ़िल्टर करना चाहता हूं ताकि केवल ऐसे नाम जहां डी 1 से डी 4 तक कोई भी 'ई' हो, तब मेरे पास होना चाहिए,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

यह कहें कि D1 स्तंभों की एक बड़ी सूची हो सकती है, इस फ़िल्टर को करने के लिए अनुशंसित दृष्टिकोण कैसे या क्या है? धन्यवाद

जवाबों:


26

यदि आप सबसेट फ़ंक्शन में कई फ़िल्टर को तार्किक ऑपरेटरों का उपयोग करना चाहते हैं :

 subset(data, D1 == "E" | D2 == "E")

उन पंक्तियों का चयन करेगा जिनके लिए या तो स्तंभ D1 या स्तंभ D2 का मान "E" है। उपलब्ध तार्किक ऑपरेटरों के लिए सहायता पृष्ठ देखें:

 > ?"|"

आपके दूसरे प्रश्न के लिए आपको पंक्तियों को फ़िल्टर करने की आवश्यकता है। यह निम्नलिखित तरीके से प्राप्त किया जा सकता है

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

पहला तर्क उस कॉलम को लागू करता है जिस पर हमें फ़िल्टर करने की आवश्यकता है। दूसरा तर्क 1 है, जिसका अर्थ है कि हम डेटा की पंक्तियों के माध्यम से लूप कर रहे हैं। तीसरा तर्क एक-लाइन फ़ंक्शन का नाम है जो TRUE देता है यदि "E" पंक्ति में मौजूद है और FALSE यदि "E" मौजूद नहीं है।

लागू फ़ंक्शन का परिणाम तार्किक वेक्टर सेल होगा , जिसकी लंबाई डेटा में पंक्तियों की संख्या के समान है। हम तब आवश्यक पंक्तियों का चयन करने के लिए इस वेक्टर का उपयोग करते हैं।

अपडेट करें

इसे grep के साथ प्राप्त किया जा सकता है:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

डिफ़ॉल्ट तर्कों के साथ आर grep में प्रदत्त वेक्टर में उन तत्वों की संख्या लौटाता है जिनमें मिलान पैटर्न होता है।


2
एक और उपयोगी कार्य है any। उदाहरण के लिए यदि आप जांचना चाहते हैं कि वेक्टर का कम से कम एक तत्व = 10तो आप लिख सकते हैं ( any(v==10))।
निको

@ निको हाँ, लेकिन 10%% v में 9 वर्ण हैं और किसी भी 10 के साथ संस्करण :)। यद्यपि संख्यात्मक वैक्टर के लिए यह समानता का उपयोग करना बेहतर है, क्योंकि R स्मार्ट है और यदि आपका डेटा पूर्णांक वास्तविक संख्याओं के साथ मिला हुआ है, तो यह सही रूप से पहचान लेगा कि आपके डेटा सेट में 10 हैं।
mpiktas

नियमित अभिव्यक्ति के मामले के बारे में क्या? यह मानते हुए कि आप एक सटीक मैच के साथ काम नहीं करना चाहते हैं? क्या उनके पास अन्य भाषाओं में ~ = के करीब कुछ है? आर
ईस्टाफ्री

@ Biorelated देखें grepऔर agrep, और POSIX 1003.2 या पर्ल-संगत रेगेक्स पर संबंधित दस्तावेज़।
CHL

@ प्रमाणित, मैंने grep के उदाहरण के साथ उत्तर को अपडेट किया है।
रात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.