Reordering and reshaping data frames

order() वे row positions return करता है जो एक data frame को sort करेंगी (df[order(df$screen), ] इसे sort करता है), sort() सिर्फ़ एक अकेले vector को sort करता है, और reshaping data को wide और long layouts के बीच move करती है।

9 min read · 9 cards · 2 checks

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


Theory

Dean को सबसे बुरा-पहले चाहिए

Cleaned survey तैयार है, और dean का अगला request reporting का सबसे पुराना है: "वही table, पर sorted: सबसे ज़्यादा screen time पहले।"

SQL में यह ORDER BY था। pandas में, sort_values। R की spelling पहले अजीब लगती है:

survey[order(-survey$screen), ]

"order" क्यों, "sort" नहीं? क्योंकि R इस काम को दो अलग functions में बाँटता है, और उन्हें confuse करना इस lesson का famous trap है। एक values return करता है; दूसरा positions return करता है।

Theory

लोगों को sort करना बनाम seat numbers बुलाना

एक class को height से arrange करने के दो तरीक़े:

  • sort() physically HEIGHTS को लाइन में लगाता है: 150, 158, 163... सिर्फ़ numbers, अपने owners से अलग।
  • order() seat positions बुलाता है: "पहले seat 7, फिर seat 2, फिर seat 9...": एक rearrangement plan जिसे पूरी class (हर column!) follow कर सकती है।

एक data frame को sort करने के लिए आपको PLAN चाहिए, अकेली values नहीं: rows को साथ move करना चाहिए, वरना scores अपने roll numbers से भटक जाते हैं।

Practical

order() tables sort करता है; sort() vectors sort करता है

survey <- read.csv("survey_clean.csv")   # roll, city, stay, screen

# sort a LONE VECTOR: sort() returns the values, ascending
sort(survey$screen)                  # 60 90 120 150 240 ...
sort(survey$screen, decreasing = TRUE)

# sort the DATA FRAME: order() returns row positions, brackets apply them
survey[order(survey$screen), ]                   # ascending
survey[order(survey$screen, decreasing = TRUE), ] # descending
survey[order(-survey$screen), ]                  # minus: same, numerics only

# multiple keys: city A-Z, then screen high-to-low within city
survey[order(survey$city, -survey$screen), ]

# what order() actually returns: a permutation of row numbers
order(c(300, 100, 200))     # [1] 2 3 1  (2nd smallest first...)

# reorder COLUMNS: plain subsetting
survey <- survey[, c("roll", "screen", "city", "stay")]

Theory

Reshaping: wide बनाम long

Sorting rows को rearrange करती है; reshaping table के layout को ही rearrange करती है।

Wide: प्रति student एक row, प्रति test एक column:

roll test1 test2 test3

Long: प्रति student-test pair एक row:

roll test score

Wide अच्छी पढ़ी जाती है; long अच्छी compute होती है (test से group कीजिए, test से plot कीजिए: हर tool इसे पसंद करता है)। Base R का reshape() इनके बीच convert करता है पर famously clunky है; modern tools tidyr के pivot_longer()/pivot_wider() हैं (जानने लायक़ नाम)। Exams के लिए: दोनों shapes जानिए, उनका trade-off, और यह कि conversion tools मौजूद हैं।

Quiz

एक student survey$screen <- sort(survey$screen) से survey sort करता है और आगे बढ़ जाता है। चुपचाप क्या टूटा?

  1. सिर्फ़ screen column sort हुआ: हर value अब ग़लत roll number के बगल में बैठी है: row alignment नष्ट है
  2. कुछ नहीं: एक column sort करने से पूरा data frame sort हो जाता है
  3. R ने error उठाई, तो कोई नुक़सान नहीं
  4. Column delete हो गया
Show the answer

सिर्फ़ screen column sort हुआ: हर value अब ग़लत roll number के बगल में बैठी है: row alignment नष्ट है

sort() अकेली values return करता है और assignment ने column को IN PLACE overwrite कर दिया: screen times अब ascending हैं जबकि roll, city और stay अपना पुराना order रखते हैं: student 101 किसी और की screen time पहनता है, बिना किसी warning error के। यह silent misalignment ही कारण है कि data frames को df[order(df$col), ] से sort किया जाता है: order() का plan हर column को साथ move करता है। शायद सबसे ख़तरनाक अकेली line जो एक beginner चला सकता है।

Think first

Permutation पढ़िए

rolls 101, 102, 103 के लिए screen <- c(300, 100, 200)। अंदाज़ा लगाइए: (1) order(screen) क्या return करता है, (2) survey[order(screen), ] में कौन सा roll पहले आता है, (3) sort(screen) क्या return करता। फिर tap कीजिए।

Show the answer

1. order(screen) = 2 3 1: "row 2 सबसे छोटी है, फिर row 3, फिर row 1"।

2. Row 2 आगे है, तो roll 102 (screen 100) पहले आता है: default रूप से ascending।

3. sort(screen) = 100 200 300: सिर्फ़ values, owners पीछे छूटे।

अगर आप "2 3 1" को values के बजाय seating plan के रूप में पढ़ सकें, order() click हो चुका है: bracket notation df[plan, ] बस हर column को उस plan से बिठाता है।

Watch out

Sorting की तीन slips

df[...] के अंदर sort(): alignment तोड़ता है या error देता है: data frames order() लेते हैं।

Missing comma: df[order(df$screen), ]: subsetting lesson का row-slot comma अभी भी लागू है।

Minus-for-descending सिर्फ़ numeric keys पर काम करता है: text या mixed keys के लिए decreasing = TRUE इस्तेमाल कीजिए (सभी keys पर लागू होता है) या keys को accordingly wrap कीजिए।

Theory

तीसरी language, वही ORDER BY

SQL: ORDER BY screen DESC। pandas: sort_values('screen', ascending=False)। R: df[order(-df$screen), ]। एक idea, तीन accents: और तीनों में, multi-key sorting (city, फिर screen) बस keys को priority order में list करना है। अगला lesson में survey एक दूसरी table से मिलता है: merge(), R का JOIN, और आपके BCA303 join instincts सीधे काम पर वापस आते हैं।

Summary

Key takeaways

  • order(x) वह row-position PLAN return करता है जो x को sort करेगी; df[order(x), ] इसे हर column पर apply करता है।
  • sort(x) एक अकेले vector की sorted VALUES return करता है: इसे कभी data frame column को in place sort करने के लिए इस्तेमाल मत कीजिए।
  • Descending: decreasing = TRUE, या numeric keys पर minus sign; multi-key: order(key1, key2)।
  • एक name vector से subsetting करके columns reorder कीजिए।
  • Wide (प्रति measure एक column) बनाम long (प्रति observation एक row): long बेहतर compute और plot करती है।
  • reshape() base R में मौजूद है; tidyr के pivot_longer/pivot_wider modern नाम हैं।
  • Memory hook: sort heights को लाइन में लगाता है; order seat numbers बुलाता है।

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