कोर्स
लगभग हर R डेटा विश्लेषण परियोजना में किसी बड़े डेटासेट से विशिष्ट पंक्तियाँ, कॉलम, या मान निकालने की ज़रूरत होती है। R में यह काम subsetting से होता है—लो-लेवल इंडेक्सिंग नियंत्रण के लिए bracket notation [], पढ़ने में आसान कंडीशन-बेस्ड फ़िल्टरिंग के लिए subset(), या आधुनिक डेटा पाइपलाइनों के लिए dplyr के filter() और select() जैसे verbs।
TL;DR
-
पोज़िशन-बेस्ड subsetting के लिए bracket notation
df[rows, cols]का उपयोग करें -
एकल कॉलम को वेक्टर के रूप में निकालने के लिए
$का उपयोग करें:df$column_name -
इंटरैक्टिव सेशंस में पढ़ने योग्य कंडीशन-बेस्ड फ़िल्टरिंग के लिए
subset(df, condition)का उपयोग करें -
एकल कॉलम चुनते समय परिणाम को डेटा फ़्रेम बनाए रखने के लिए
drop = FALSEजोड़ें -
प्रोडक्शन कोड और डेटा पाइपलाइनों के लिए,
subset()की बजाय bracket notation याdplyr::filter()को प्राथमिकता दें
पंक्तियाँ चुनना
यहाँ data frame debt पर subsetting का एक उदाहरण है।
debt[3:6, ]
name payment
3 Dan 150
4 Rob 50
5 Rob 75
6 Rob 100
df[rows, columns] सिंटैक्स R subsetting की बुनियाद है। यहाँ 3:6 पंक्तियाँ 3 से 6 तक चुनता है, और कॉमा के बाद खाली स्थान का मतलब है "सभी कॉलम लौटाएँ"। परिणाम मूल जैसी कॉलम संरचना वाला एक छोटा डेटा फ़्रेम होता है।
किसी विशिष्ट कॉलम से पंक्तियाँ चुनना
ध्यान देने योग्य एक व्यवहार वह सरलीकरण है जो तब होता है जब आप एक ही कॉलम चुनते हैं। केवल payment कॉलम की पहली तीन पंक्तियाँ चुनने पर परिणाम एक वेक्टर में सरल हो जाता है।
debt[1:3, 2]
100 200 150
यहाँ 2 का अर्थ debt के दूसरे कॉलम, यानी payment से है। क्योंकि हमने एक ही कॉलम चुना, R डेटा फ़्रेम संरचना हटाकर एक साधारण न्यूमेरिक वेक्टर लौटाता है।
डेटाफ्रेम फ़ॉर्मैटिंग
इसे dataframe के रूप में बनाए रखने के लिए, नीचे दिखाए अनुसार drop = FALSE जोड़ दें:
debt[1:3, 2, drop = FALSE]
payment
1 100
2 200
3 150
किसी विशिष्ट कॉलम का चयन
आप $ ऑपरेटर से भी एक कॉलम चुन सकते हैं, जैसे dataframe$column। निम्न उदाहरण में debt से payment कॉलम निकाला गया है। R परिणाम को डेटा फ़्रेम के बजाय वेक्टर के रूप में लौटाता है।
debt$payment
100 200 150 50 75 100
subset() फ़ंक्शन का उपयोग
जब आपको अधिक जटिल subsets चाहिए हों या किसी कंडीशन पर आधारित subset बनाना हो, तो अगला कदम subset() फ़ंक्शन का उपयोग है। उदाहरण के लिए, मान लीजिए आप Dan नामक व्यक्ति का debt देखना चाहते हैं। आप ब्रैकेट्स से उनकी एंट्री चुनकर टोटल कर सकते हैं, पर यह तरीका बहुत मज़बूत नहीं है, खासकर जब डेटासेट में बदलाव हो सकते हैं।
# यह काम करता है, लेकिन सूचनात्मक नहीं है
debt[1:3, ]
श्रेणीबद्ध चर पर subset()
बेहतर तरीका यह है कि subset() का उपयोग करके वे पंक्तियाँ चुनें जहाँ name कॉलम Dan के बराबर हो। ध्यान दें कि यहाँ डबल इक्वल्स साइन (==) चाहिए, जिसे relational operator कहा जाता है।
# यह काम करता है, लेकिन न तो सूचनात्मक है और न ही मज़बूत
debt[1:3, ]
# कहीं अधिक सूचनात्मक!
subset(debt, name == "Dan")
name payment
1 Dan 100
2 Dan 200
3 Dan 150
परिणाम में केवल वे तीन पंक्तियाँ हैं जहाँ name "Dan" के बराबर है। ध्यान दें कि मूल पंक्ति संख्याएँ (1, 2, 3) संरक्षित रहती हैं, जिससे आप परिणाम को स्रोत डेटा फ़्रेम तक ट्रेस कर सकते हैं।
सांख्यिकीय चर पर subset()
हम न्यूमेरिक कॉलम पर भी subset कर सकते हैं। यदि हम वे पंक्तियाँ देखना चाहें जहाँ payments $100 के बराबर हों, तो आप यह करेंगे:
subset(debt, payment == 100)
name payment
1 Dan 100
6 Rob 100
दो पंक्तियाँ कंडीशन से मेल खाती हैं: पंक्ति 1 (Dan) और पंक्ति 6 (Rob) दोनों के payment ठीक $100 हैं। यह दर्शाता है कि subset() नाम की परवाह किए बिना हर पंक्ति स्कैन करता है और सभी मैच लौटाता है।
डेटाफ्रेम्स को एक्सेस और subset करना
यदि आपको केवल कंपनी A से cash flows चाहिएँ? यहाँ subset() फ़ंक्शन एक अलग डेटा फ़्रेम cash से पंक्तियाँ फ़िल्टर करता है:
subset(cash, company == "A")
company cash_flow year
1 A 1000 1
2 A 4000 3
3 A 550 4
याद रखें:
-
subset()को दिया गया पहला आर्ग्युमेंट आपके डेटा फ़्रेम का नाम होता है, यहाँcash। -
ध्यान दें कि आपको
companyको उद्धरण चिह्नों में नहीं रखना चाहिए! -
==इक्वैलिटी ऑपरेटर है। यह जाँचता है कि दो चीजें कहाँ बराबर हैं और एक लॉजिकल वेक्टर लौटाता है।
subset() विधि का इंटरैक्टिव उदाहरण
निम्न उदाहरण में, हम subset() का उपयोग करके cash की वे पंक्तियाँ चुनते हैं जो कंपनी B से संबंधित हैं, फिर 1 वर्ष में देय cash flows को फ़िल्टर करते हैं।
# कंपनी B से संबंधित पंक्तियाँ
subset(cash, company == "B")
# 1 वर्ष में देय cash flows वाली पंक्तियाँ
subset(cash, year == 1)
जब आप ऊपर का कोड चलाते हैं, तो यह निम्न परिणाम देता है:
company cash_flow year
4 B 1500 1
5 B 1100 2
6 B 750 4
7 B 6000 5
company cash_flow year
1 A 1000 1
4 B 1500 1
इसे स्वयं आज़माएँ: Introduction to R for Finance कोर्स में।
यह सामग्री DataCamp के Introduction to R for Finance कोर्स (लेखक: Lore Dirick) से ली गई है।
dplyr के साथ Subsetting
tidyverse का पैकेज dplyr डेटा फ़्रेम्स को subset करने का एक आधुनिक विकल्प प्रदान करता है। इसका filter() फ़ंक्शन पंक्तियाँ चुनता है और select() कॉलम, दोनों pipe-बेस्ड सिंटैक्स का उपयोग करते हैं जो ऑपरेशनों को चेन करता है।
library(dplyr)
# वे पंक्तियाँ फ़िल्टर करें जहाँ name "Dan" है
debt %>% filter(name == "Dan")
# केवल payment कॉलम चुनें (डेटा फ़्रेम ही रहता है)
debt %>% select(payment)
# संयोजन: एक ही पाइपलाइन में पंक्तियाँ फ़िल्टर करें और कॉलम चुनें
debt %>%
filter(payment >= 100) %>%
select(name, payment)
subset() के विपरीत, dplyr फ़ंक्शन अन्य फ़ंक्शनों के अंदर भरोसेमंद ढंग से काम करते हैं और उसी पाइपलाइन में grouped operations, joins, और summaries को संभालते हैं। यदि आप एकबारगी क्वेरी के बजाय डेटा विश्लेषण वर्कफ़्लो बना रहे हैं, तो dplyr मानक टूल है।
Subsetting तरीकों की तुलना
आइए R में विभिन्न subsetting तरीकों की तुलना एक तालिका में करें:
| तरीका | सिंटैक्स | उपयुक्त किसके लिए | टिप्पणियाँ |
|---|---|---|---|
Brackets [] |
df[rows, cols] |
लो-लेवल नियंत्रण, प्रोग्रामिंग | सभी R ऑब्जेक्ट्स पर काम करता है |
$ |
df$col |
तेज़ी से एकल कॉलम निकालना | वेक्टर लौटाता है, डेटा फ़्रेम नहीं |
subset() |
subset(df, cond) |
इंटरैक्टिव फ़िल्टरिंग | फ़ंक्शंस के अंदर अनुशंसित नहीं |
dplyr::filter() |
df %>% filter(cond) |
डेटा पाइपलाइंस, पठनीय कोड | dplyr पैकेज की आवश्यकता |
अंतिम विचार
R आपको डेटा subset करने के कई तरीके देता है: पूर्ण नियंत्रण के लिए bracket notation [], पढ़ने योग्य इंटरैक्टिव फ़िल्टरिंग के लिए subset(), और डेटा पाइपलाइनों के लिए dplyr::filter()। Brackets किसी भी R ऑब्जेक्ट पर काम करते हैं, subset() एकबारगी एक्सप्लोरेशन के लिए स्पष्ट पढ़ाई देता है, और dplyr तब अच्छा स्केल करता है जब आप कई ऑपरेशनों को चेन कर रहे हों।
R में डेटा मैनिपुलेशन को गहराई से सीखने के लिए, मैं Data Manipulation with dplyr या DataCamp पर Introduction to the Tidyverse कोर्स की अनुशंसा करता हूँ।
R में Subset संबंधित FAQs
R में subset() और dplyr::filter() में क्या अंतर है?
दोनों फ़ंक्शंस कंडीशंस के आधार पर पंक्तियाँ फ़िल्टर करते हैं, लेकिन प्रोग्रामिंग संदर्भों में इनका व्यवहार अलग है। subset() non-standard evaluation का उपयोग करता है, जो इंटरैक्टिव उपयोग में सुविधाजनक है लेकिन यूज़र-परिभाषित फ़ंक्शंस के अंदर अविश्वसनीय हो सकता है। dplyr::filter() फ़ंक्शंस के अंदर सुरक्षित रूप से काम करने के लिए डिज़ाइन किया गया है और pipe ऑपरेटर (%>%) के साथ एकीकृत होकर कई डेटा मैनिपुलेशन चरणों को चेन करता है।
मैं R में एक साथ कई कॉलम कैसे subset करूँ?
आप ब्रैकेट्स के अंदर कॉलम नामों या इंडेक्सों का वेक्टर पास कर सकते हैं। उदाहरण के लिए, df[, c("name", "payment")] नाम से दो कॉलम चुनता है, जबकि df[, c(1, 3)] इन्हें पोज़िशन से चुनता है। dplyr में, आप select(df, name, payment) या starts_with() और contains() जैसी helper फ़ंक्शंस से पैटर्न के आधार पर कॉलम मैच कर सकते हैं।
R में एकल कॉलम चुनने पर डेटा फ़्रेम की जगह वेक्टर क्यों लौटता है?
जब ब्रैकेट नोटेशन से केवल एक कॉलम चुना जाता है, तो R डिफ़ॉल्ट रूप से परिणाम को सरल कर देता है। यह व्यवहार drop पैरामीटर द्वारा नियंत्रित होता है, जिसका डिफ़ॉल्ट मान TRUE है। परिणाम को डेटा फ़्रेम बनाए रखने के लिए, अपनी ब्रैकेट अभिव्यक्ति में drop = FALSE जोड़ें, जैसे df[, 2, drop = FALSE]।
क्या मैं R में कई कंडीशंस के आधार पर पंक्तियाँ subset कर सकता/सकती हूँ?
हाँ। आप कंडीशंस को & (AND) और | (OR) ऑपरेटरों से जोड़ सकते हैं। उदाहरण के लिए, subset(df, name == "Dan" & payment > 100) वे पंक्तियाँ लौटाता है जहाँ नाम Dan है और payment 100 से अधिक है। dplyr में, आप filter() के अंदर कंडीशंस को कॉमा से अलग कर सकते हैं: df %>% filter(name == "Dan", payment > 100)।