Theory
दो tables, एक सवाल
Registrar आख़िरकार CGPA file share करते हैं: roll, cgpa, प्रति student एक row। आपकी survey roll, screen रखती है। वह सवाल जिसका सब इंतज़ार कर रहे थे: क्या screen time CGPA से related है?
दोनों variables अलग-अलग data frames में रहते हैं, सिर्फ़ अपने shared roll numbers से जुड़े।
आपने SQL में (JOIN) और pandas में (pd.merge) tables stitch की हैं। R की needle merge() है, और आपके join instincts पूरी तरह transfer होते हैं: सिर्फ़ switch names बदलते हैं।
Theory
दो registers वाला clerk, फिर से
BCA303 वाला ही clerk: एक हाथ में admissions register, दूसरे में marks register, rows को roll number से match करते हुए और staple करते हुए।
एकमात्र decision जो कभी बदलता है: बिना match वाले roll का क्या करें: student skip कीजिए (inner), उन्हें blanks के साथ रखिए (left), दोनों books से सब कुछ रखिए (full outer)। merge() इस decision को दो शब्दों में encode करता है: all.x, all.y।
Practical
Join family, R में spelled
survey <- data.frame(roll = c(101, 102, 103),
screen = c(120, 240, 90))
cgpa <- data.frame(roll = c(101, 103, 104),
cgpa = c(8.2, 6.9, 7.5))
# INNER (the default): only rolls present in BOTH
merge(survey, cgpa, by = "roll")
# roll screen cgpa -> 101 and 103 only
# LEFT: keep every SURVEY row; missing cgpa becomes NA
merge(survey, cgpa, by = "roll", all.x = TRUE)
# 102 keeps its screen, cgpa = NA
# FULL OUTER: keep everything from both
merge(survey, cgpa, by = "roll", all = TRUE)
# 102 (no cgpa) AND 104 (no survey) both appear
# different key names on the two sides:
# merge(survey, cgpa, by.x = "roll", by.y = "student_id")
# find the unmatched after a left join:
m <- merge(survey, cgpa, by = "roll", all.x = TRUE)
m[is.na(m$cgpa), ] # the surveyed-but-no-CGPA students
At a glance
merge() switches = SQL join family
| SQL join | merge() call | क्या रहता है |
|---|---|---|
| INNER | merge(x, y, by) | सिर्फ़ matched keys (default) |
| LEFT | all.x = TRUE | x का सब कुछ; NAs gaps भरते हैं |
| RIGHT | all.y = TRUE | y का सब कुछ |
| FULL OUTER | all = TRUE | दोनों से सब कुछ |
Quiz
survey में 60 rows हैं; cgpa में 55 (पाँच students के पास अभी CGPA नहीं है)। एक student merge(survey, cgpa, by = "roll") चलाता है और report चुपचाप 55 students cover करती है। क्या हुआ, और "सभी surveyed students analyse कीजिए" के लिए सही call क्या थी?
- Default merge INNER है: पाँच unmatched students चुपचाप ग़ायब हो गए; all.x = TRUE (left join) सभी 60 को NA cgpa के साथ रखता है
- merge() fail हो गया: अलग row counts merge नहीं हो सकते
- सिर्फ़ survey rows रखने के लिए all = TRUE की ज़रूरत थी
- पाँच students CSV files से delete हो गए
Show the answer
Default merge INNER है: पाँच unmatched students चुपचाप ग़ायब हो गए; all.x = TRUE (left join) सभी 60 को NA cgpa के साथ रखता है
merge() का default inner join है: unmatched rolls बस दिखते नहीं, कोई warning नहीं: वही silent-shrink जो आपने SQL के INNER JOIN के साथ देखा। "सभी surveyed students analyse कीजिए" left-join वाला sentence है: all.x = TRUE, और पाँचों NA cgpa के साथ दिखते हैं (फिर आपके NA toolkit से handled)। all = TRUE अतिरिक्त cgpa-only students को ADD कर देता। यह instantly पकड़ने वाली आदत: हर merge से पहले और बाद में nrow()।
Think first
Row counts अंदाज़ा लगाइए
survey: rolls 101, 102, 103। cgpa: rolls 101, 103, 104। tap करने से पहले, हर एक का row count दीजिए: (1) inner merge, (2) all.x = TRUE, (3) all = TRUE। फिर बताइए version 3 में कौन से rolls NA रखते हैं।
Show the answer
1. 2 rows (101, 103: दोनों में मौजूद)।
2. 3 rows (सभी survey rolls; 102 का cgpa = NA)।
3. 4 rows (101, 102, 103, 104): roll 102 का cgpa NA है और roll 104 का screen NA है: हर side का orphan दूसरी side का blank ढोता है।
Inner ≤ left ≤ full: अगर आपकी counts कभी इस order को तोड़ें, एक duplicated key rows multiply कर रही है: अगला जानने लायक़ trap।
Watch out
दो silent mergers
Inner default: unmatched rows बिना किसी फुसफुसाहट के ग़ायब हो जाते हैं: type करने से पहले join TYPE decide कीजिए, और nrow() पहले/बाद में।
Duplicate keys multiply करती हैं: अगर cgpa गलती से roll 101 को दो बार list करे, merge हर copy को pair करता है: 60 rows बिना किसी error के 61+ बन जाती हैं। merge करने से पहले sum(duplicated(cgpa$roll)) दस-सेकंड का insurance है।
Theory
यह वह analysis सक्षम करता है
screen और cgpa आख़िरकार एक data frame में होने से, Units 1-2 के सवाल असली pairs पर जीवंत हो जाते हैं: screen बनाम cgpa का एक scatter plot (आँख से correlation), अगले lesson के summary commands के ज़रिए group means, usage band बनाम grade band के cross-tabs। हर serious analysis एक merge से शुरू होता है: एक ही लोगों के बारे में data हमेशा अलग files में आता है।
Summary
Key takeaways
- merge(x, y, by = "key") एक shared column पर join करता है; DEFAULT INNER है (सिर्फ़ matched keys)।
- all.x = TRUE = left join (x का सब कुछ, NA gaps); all.y = right; all = TRUE = full outer join।
- अलग key names: by.x / by.y; multiple keys: by = c(...)।
- Left-join NAs unmatched को mark करते हैं: is.na() से उन्हें ढूँढिए।
- हर merge से पहले/बाद में nrow(); duplicate keys चुपचाप rows multiply करती हैं।
- SQL JOINs और pd.merge(how=) जैसा ही family: तीसरी language, वही clerk।
- Memory hook: clerk बिना match वाले roll का क्या करता है?