Merging and joining data frames

merge(df1, df2, by = "roll") दो data frames को एक shared key पर बिल्कुल SQL के JOIN जैसे stitch करता है, और all/all.x/all.y switches inner, left, right और full outer behaviour में से चुनते हैं।

9 min read · 9 cards · 2 checks

Read in: English · हिन्दी · ગુજરાતી


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 joinmerge() callक्या रहता है
INNERmerge(x, y, by)सिर्फ़ matched keys (default)
LEFTall.x = TRUEx का सब कुछ; NAs gaps भरते हैं
RIGHTall.y = TRUEy का सब कुछ
FULL OUTERall = TRUEदोनों से सब कुछ

Quiz

survey में 60 rows हैं; cgpa में 55 (पाँच students के पास अभी CGPA नहीं है)। एक student merge(survey, cgpa, by = "roll") चलाता है और report चुपचाप 55 students cover करती है। क्या हुआ, और "सभी surveyed students analyse कीजिए" के लिए सही call क्या थी?

  1. Default merge INNER है: पाँच unmatched students चुपचाप ग़ायब हो गए; all.x = TRUE (left join) सभी 60 को NA cgpa के साथ रखता है
  2. merge() fail हो गया: अलग row counts merge नहीं हो सकते
  3. सिर्फ़ survey rows रखने के लिए all = TRUE की ज़रूरत थी
  4. पाँच 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 का क्या करता है?

Study this properly

This page is the lesson to read. In Gri-Learn the same topic is a graded deck: the self-checks are scored and your weak topics are tracked. Free to start.

Start this topic

Already have an account? Sign in

More from Working with Data in R

Gri-Learn · syllabus-mapped B.C.A. lessons in English, Hindi and Gujarati

Merging and joining data frames · Statistical Methods and Data Analysis (MDC-03) · Gri-Learn