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 करता है और आगे बढ़ जाता है। चुपचाप क्या टूटा?
- सिर्फ़ screen column sort हुआ: हर value अब ग़लत roll number के बगल में बैठी है: row alignment नष्ट है
- कुछ नहीं: एक column sort करने से पूरा data frame sort हो जाता है
- R ने error उठाई, तो कोई नुक़सान नहीं
- 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 बुलाता है।