پرو ہوسٹر > بلاگ > انتظامیہ > R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور pivot_wider
R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور pivot_wider
پیکیج صاف R زبان میں سب سے زیادہ مقبول لائبریریوں میں سے ایک میں شامل - صاف ستھرا.
پیکیج کا بنیادی مقصد ڈیٹا کو درست شکل میں لانا ہے۔
Habré پر پہلے سے ہی دستیاب ہے۔ اشاعت اس پیکیج کے لیے وقف ہے، لیکن یہ 2015 کا ہے۔ اور میں آپ کو سب سے حالیہ تبدیلیوں کے بارے میں بتانا چاہتا ہوں، جن کا اعلان کچھ دن پہلے اس کے مصنف ہیڈلی وکھم نے کیا تھا۔
ایس جے کے: کیا gather() اور spread() کو فرسودہ کر دیا جائے گا؟
ہیڈلی وکھم: کسی حد تک. ہم مزید ان فنکشنز کے استعمال کی سفارش نہیں کریں گے اور ان میں کیڑے ٹھیک کریں گے، لیکن وہ اپنی موجودہ حالت میں پیکیج میں موجود رہیں گے۔
مواد
اگر آپ ڈیٹا کے تجزیے میں دلچسپی رکھتے ہیں، تو آپ کو میری میں دلچسپی ہو سکتی ہے۔ تار и یو ٹیوب پر چینلز زیادہ تر مواد R زبان کے لیے وقف ہے۔
گول صاف — ڈیٹا کو نام نہاد صاف شکل میں لانے میں آپ کی مدد کریں۔ صاف ڈیٹا وہ ڈیٹا ہے جہاں:
ہر متغیر کالم میں ہوتا ہے۔
ہر مشاہدہ ایک تار ہے۔
ہر قدر ایک سیل ہے۔
تجزیہ کرتے وقت صاف ستھرا ڈیٹا میں پیش کیے گئے ڈیٹا کے ساتھ کام کرنا بہت آسان اور آسان ہے۔
tidyr پیکج میں شامل اہم افعال
tidyr میں ٹیبل کو تبدیل کرنے کے لیے ڈیزائن کردہ افعال کا ایک سیٹ شامل ہے:
fill() - سابقہ اقدار کے ساتھ کالم میں گم شدہ اقدار کو بھرنا؛
separate() - جداکار کا استعمال کرتے ہوئے ایک فیلڈ کو کئی میں تقسیم کرتا ہے۔
unite() - کئی فیلڈز کو ایک میں ملانے کا عمل انجام دیتا ہے، فنکشن کا الٹا عمل separate();
pivot_longer() - ایک فنکشن جو ڈیٹا کو وسیع فارمیٹ سے لمبے فارمیٹ میں تبدیل کرتا ہے۔
pivot_wider() - ایک فنکشن جو ڈیٹا کو لمبی شکل سے وسیع فارمیٹ میں تبدیل کرتا ہے۔ فنکشن کے ذریعے انجام پانے والے کا ریورس آپریشن pivot_longer().
gather()متروک - ایک فنکشن جو ڈیٹا کو وسیع فارمیٹ سے لمبے فارمیٹ میں تبدیل کرتا ہے۔
spread()متروک - ایک فنکشن جو ڈیٹا کو لمبی شکل سے وسیع فارمیٹ میں تبدیل کرتا ہے۔ فنکشن کے ذریعے انجام پانے والے کا ریورس آپریشن gather().
ڈیٹا کو چوڑے سے لانگ فارمیٹ میں اور اس کے برعکس تبدیل کرنے کا نیا تصور
پہلے، اس قسم کی تبدیلی کے لیے فنکشنز استعمال کیے جاتے تھے۔ gather() и spread(). ان فنکشنز کے وجود کے سالوں کے دوران، یہ واضح ہو گیا کہ زیادہ تر صارفین کے لیے، بشمول پیکیج کے مصنف، ان فنکشنز کے نام اور ان کے دلائل بالکل واضح نہیں تھے، اور ان کو تلاش کرنے اور یہ سمجھنے میں مشکلات کا باعث بنتے ہیں کہ ان میں سے کون سا فنکشن تبدیل ہوتا ہے۔ چوڑے سے لمبے فارمیٹ تک تاریخ کا فریم، اور اس کے برعکس۔
اس سلسلے میں، میں صاف دو نئے، اہم افعال شامل کیے گئے ہیں جو تاریخ کے فریموں کو تبدیل کرنے کے لیے بنائے گئے ہیں۔
نئی خصوصیات pivot_longer() и pivot_wider() پیکیج میں کچھ خصوصیات سے متاثر تھے۔ cdataجان ماؤنٹ اور نینا زومل نے تخلیق کیا۔
tidyr 0.8.3.9000 کا جدید ترین ورژن انسٹال کرنا
پیکیج کا نیا، جدید ترین ورژن انسٹال کرنے کے لیے صاف0.8.3.9000جہاں نئی خصوصیات دستیاب ہیں، درج ذیل کوڈ کا استعمال کریں۔
devtools::install_github("tidyverse/tidyr")
لکھنے کے وقت، یہ فنکشن صرف GitHub پر پیکیج کے دیو ورژن میں دستیاب ہیں۔
نئی خصوصیات میں منتقلی۔
درحقیقت، نئے فنکشنز کے ساتھ کام کرنے کے لیے پرانے اسکرپٹس کو منتقل کرنا مشکل نہیں ہے؛ بہتر سمجھنے کے لیے، میں پرانے فنکشنز کی دستاویزات سے ایک مثال لوں گا اور دکھاؤں گا کہ نئے فنکشنز کا استعمال کرتے ہوئے وہی آپریشن کیسے کیے جاتے ہیں۔ pivot_*() افعال.
وسیع فارمیٹ کو لمبی شکل میں تبدیل کریں۔
جمع فنکشن دستاویزات سے مثال کوڈ
# example
library(dplyr)
stocks <- data.frame(
time = as.Date('2009-01-01') + 0:9,
X = rnorm(10, 0, 1),
Y = rnorm(10, 0, 2),
Z = rnorm(10, 0, 4)
)
# old
stocks_gather <- stocks %>% gather(key = stock,
value = price,
-time)
# new
stocks_long <- stocks %>% pivot_longer(cols = -time,
names_to = "stock",
values_to = "price")
طویل فارمیٹ کو وسیع فارمیٹ میں تبدیل کرنا۔
اسپریڈ فنکشن دستاویزات سے مثال کوڈ
# old
stocks_spread <- stocks_gather %>% spread(key = stock,
value = price)
# new
stock_wide <- stocks_long %>% pivot_wider(names_from = "stock",
values_from = "price")
کیونکہ کے ساتھ کام کرنے کی مندرجہ بالا مثالوں میں pivot_longer() и pivot_wider()، اصل جدول میں سٹاکس دلائل میں کوئی کالم درج نہیں ہے۔ names_to и اقدار_سے ان کے نام کوٹیشن مارکس میں ہونے چاہئیں۔
ایک ٹیبل جو آپ کو آسانی سے یہ معلوم کرنے میں مدد کرے گا کہ نئے تصور کے ساتھ کام کرنے کا طریقہ کیسے بنایا جائے۔ صاف.
مصنف کی طرف سے نوٹ
نیچے دی گئی تمام عبارت موافقت پذیر ہے، میں یہاں تک کہ مفت ترجمہ بھی کہوں گا۔ vignettes سرکاری صاف ستھری لائبریری کی ویب سائٹ سے۔
ڈیٹا کو چوڑے سے لمبے فارمیٹ میں تبدیل کرنے کی ایک سادہ مثال
pivot_longer () - کالموں کی تعداد کو کم کرکے اور قطاروں کی تعداد میں اضافہ کرکے ڈیٹا سیٹ کو طویل کرتا ہے۔
مضمون میں پیش کردہ مثالوں کو چلانے کے لیے، آپ کو پہلے ضروری پیکجوں کو جوڑنے کی ضرورت ہے:
library(tidyr)
library(dplyr)
library(readr)
ہم کہتے ہیں کہ ہمارے پاس سروے کے نتائج کے ساتھ ایک ٹیبل ہے جس میں (دوسری چیزوں کے علاوہ) لوگوں سے ان کے مذہب اور سالانہ آمدنی کے بارے میں پوچھا گیا:
اس جدول میں جواب دہندگان کے مذہب کا ڈیٹا قطاروں میں ہے، اور آمدنی کی سطح کالم کے ناموں میں بکھری ہوئی ہے۔ ہر زمرے کے جواب دہندگان کی تعداد کو سیل ویلیوز میں مذہب اور آمدنی کی سطح کے بیچ میں محفوظ کیا جاتا ہے۔ میز کو صاف، درست شکل میں لانے کے لیے، اسے استعمال کرنا کافی ہے۔ pivot_longer():
پہلی دلیل کالر، بتاتا ہے کہ کن کالموں کو ضم کرنے کی ضرورت ہے۔ اس صورت میں، تمام کالموں کے علاوہ وقت.
دلیل names_to متغیر کا نام دیتا ہے جو کالموں کے ناموں سے بنائے جائیں گے جن کو ہم نے جوڑ دیا ہے۔
اقدار_سے ایک متغیر کا نام دیتا ہے جو ضم شدہ کالموں کے سیلز کی قدروں میں ذخیرہ شدہ ڈیٹا سے بنایا جائے گا۔
نردجیکرن
یہ پیکیج کی ایک نئی فعالیت ہے۔ صاف, جو کہ پہلے لیگیسی فنکشنز کے ساتھ کام کرتے وقت دستیاب نہیں تھا۔
تصریح ایک ڈیٹا فریم ہے، جس کی ہر قطار نئے آؤٹ پٹ ڈیٹ فریم میں ایک کالم کے مساوی ہے، اور دو خاص کالم جو اس سے شروع ہوتے ہیں:
نام اصل کالم کے نام پر مشتمل ہے۔
.قدر اس کالم کے نام پر مشتمل ہے جس میں سیل کی قدریں ہوں گی۔
تفصیلات کے بقیہ کالم اس بات کی عکاسی کرتے ہیں کہ نیا کالم کس طرح سے کمپریسڈ کالموں کا نام ظاہر کرے گا۔ نام.
تصریح کالم کے نام میں ذخیرہ شدہ میٹا ڈیٹا کی وضاحت کرتی ہے، جس میں ہر کالم کے لیے ایک قطار اور کالم کے نام کے ساتھ مل کر ہر متغیر کے لیے ایک کالم ہوتا ہے، جو اس وقت مبہم معلوم ہوتا ہے، لیکن چند مثالوں کو دیکھنے کے بعد یہ زیادہ واضح ہو جائے گا۔
تفصیلات کا نقطہ یہ ہے کہ آپ ڈیٹا فریم کو تبدیل کرنے کے لیے نئے میٹا ڈیٹا کی بازیافت، ترمیم اور وضاحت کر سکتے ہیں۔
ٹیبل کو وسیع فارمیٹ سے لمبے فارمیٹ میں تبدیل کرتے وقت تصریحات کے ساتھ کام کرنے کے لیے، فنکشن کا استعمال کریں۔ pivot_longer_spec().
یہ فنکشن کیسے کام کرتا ہے کہ یہ کسی بھی تاریخ کا فریم لیتا ہے اور اوپر بیان کیے گئے طریقے سے اپنا میٹا ڈیٹا تیار کرتا ہے۔
مثال کے طور پر، آئیے لے لیں کہ کون ڈیٹاسیٹ ہے جو پیکیج کے ساتھ فراہم کیا گیا ہے۔ صاف. یہ ڈیٹا سیٹ تپ دق کے واقعات پر بین الاقوامی ادارہ صحت کی طرف سے فراہم کردہ معلومات پر مشتمل ہے۔
who
#> # A tibble: 7,240 x 60
#> country iso2 iso3 year new_sp_m014 new_sp_m1524 new_sp_m2534
#> <chr> <chr> <chr> <int> <int> <int> <int>
#> 1 Afghan… AF AFG 1980 NA NA NA
#> 2 Afghan… AF AFG 1981 NA NA NA
#> 3 Afghan… AF AFG 1982 NA NA NA
#> 4 Afghan… AF AFG 1983 NA NA NA
#> 5 Afghan… AF AFG 1984 NA NA NA
#> 6 Afghan… AF AFG 1985 NA NA NA
#> 7 Afghan… AF AFG 1986 NA NA NA
#> 8 Afghan… AF AFG 1987 NA NA NA
#> 9 Afghan… AF AFG 1988 NA NA NA
#> 10 Afghan… AF AFG 1989 NA NA NA
#> # … with 7,230 more rows, and 53 more variables
آئیے اس کی تفصیلات بنائیں۔
spec <- who %>%
pivot_longer_spec(new_sp_m014:newrel_f65, values_to = "count")
قطعات ملک, isoxnumx, isoxnumx پہلے سے ہی متغیر ہیں۔ ہمارا کام کالموں کو پلٹنا ہے۔ new_sp_m014 پر newrel_f65.
ان کالموں کے نام درج ذیل معلومات کو محفوظ کرتے ہیں:
سابقہ new_ اشارہ کرتا ہے کہ کالم میں تپ دق کے نئے کیسز کا ڈیٹا موجود ہے، موجودہ تاریخ کے فریم میں صرف نئی بیماریوں کے متعلق معلومات ہیں، اس لیے موجودہ تناظر میں یہ سابقہ کوئی معنی نہیں رکھتا۔
sp/rel/sp/ep بیماری کی تشخیص کا طریقہ بیان کرتا ہے۔
m/f مریض کی جنس.
014/1524/2535/3544/4554/65 مریض کی عمر کی حد.
ہم فنکشن کا استعمال کرتے ہوئے ان کالموں کو تقسیم کر سکتے ہیں۔ extract()باقاعدہ اظہار کا استعمال کرتے ہوئے.
آخر میں، تصریح کو لاگو کرنے کے لیے جو ہم نے اصل تاریخ کے فریم پر بنائی ہے۔ جو ہمیں ایک دلیل استعمال کرنے کی ضرورت ہے۔ نمونہ فنکشن میں pivot_longer().
who %>% pivot_longer(spec = spec)
#> # A tibble: 405,440 x 8
#> country iso2 iso3 year diagnosis gender age count
#> <chr> <chr> <chr> <int> <chr> <fct> <ord> <int>
#> 1 Afghanistan AF AFG 1980 sp m 014 NA
#> 2 Afghanistan AF AFG 1980 sp m 1524 NA
#> 3 Afghanistan AF AFG 1980 sp m 2534 NA
#> 4 Afghanistan AF AFG 1980 sp m 3544 NA
#> 5 Afghanistan AF AFG 1980 sp m 4554 NA
#> 6 Afghanistan AF AFG 1980 sp m 5564 NA
#> 7 Afghanistan AF AFG 1980 sp m 65 NA
#> 8 Afghanistan AF AFG 1980 sp f 014 NA
#> 9 Afghanistan AF AFG 1980 sp f 1524 NA
#> 10 Afghanistan AF AFG 1980 sp f 2534 NA
#> # … with 405,430 more rows
ہم نے جو کچھ بھی کیا ہے اس کی خاکہ نگاری اس طرح کی جا سکتی ہے:
متعدد اقدار کا استعمال کرتے ہوئے تفصیلات (.value)
مندرجہ بالا مثال میں، تفصیلات کالم .قدر صرف ایک قدر پر مشتمل ہے، زیادہ تر معاملات میں ایسا ہی ہوتا ہے۔
لیکن کبھی کبھار ایسی صورت حال پیدا ہو سکتی ہے جب آپ کو کالموں سے ڈیٹا اکٹھا کرنے کی ضرورت ہوتی ہے جس میں مختلف ڈیٹا کی اقسام ہوتی ہیں۔ میراثی فنکشن استعمال کرنا spread() یہ کرنا کافی مشکل ہو گا.
ذیل کی مثال سے لی گئی ہے۔ vignettes پیکج کو ڈیٹا ٹیبل.
بنائے گئے ڈیٹ فریم میں ہر قطار میں ایک خاندان کے بچوں کا ڈیٹا ہوتا ہے۔ خاندانوں میں ایک یا دو بچے ہو سکتے ہیں۔ ہر بچے کے لیے، تاریخ پیدائش اور جنس پر ڈیٹا فراہم کیا جاتا ہے، اور ہر بچے کا ڈیٹا الگ الگ کالموں میں ہوتا ہے؛ ہمارا کام اس ڈیٹا کو تجزیہ کے لیے درست شکل میں لانا ہے۔
براہ کرم نوٹ کریں کہ ہمارے پاس ہر بچے کے بارے میں معلومات کے ساتھ دو متغیرات ہیں: ان کی جنس اور تاریخ پیدائش (سابقہ کے ساتھ کالم DOP تاریخ پیدائش، سابقہ کے ساتھ کالم پر مشتمل ہے۔ صنفی بچے کی جنس پر مشتمل ہے)۔ متوقع نتیجہ یہ ہے کہ وہ الگ الگ کالموں میں ظاہر ہونا چاہئے۔ ہم ایک تصریح تیار کر کے ایسا کر سکتے ہیں جس میں کالم .value دو مختلف معنی ہوں گے۔
spec <- family %>%
pivot_longer_spec(-family) %>%
separate(col = name, into = c(".value", "child"))%>%
mutate(child = parse_number(child))
#> # A tibble: 4 x 3
#> .name .value child
#> <chr> <chr> <dbl>
#> 1 dob_child1 dob 1
#> 2 dob_child2 dob 2
#> 3 gender_child1 gender 1
#> 4 gender_child2 gender 2
تو، آئیے درج بالا کوڈ کے ذریعے انجام پانے والے اعمال پر ایک قدم بہ قدم نظر ڈالیں۔
pivot_longer_spec(-family) - ایک تصریح بنائیں جو فیملی کالم کے علاوہ تمام موجودہ کالموں کو کمپریس کرے۔
separate(col = name, into = c(".value", "child")) - کالم کو تقسیم کریں۔ نام، جس میں ماخذ فیلڈز کے نام ہوتے ہیں، انڈر سکور کا استعمال کرتے ہوئے اور نتیجے میں آنے والی اقدار کو کالموں میں داخل کرنا .قدر и بچے.
mutate(child = parse_number(child)) - فیلڈ کی اقدار کو تبدیل کریں۔ بچے متن سے عددی ڈیٹا کی قسم تک۔
اب ہم اصل ڈیٹا فریم پر نتیجے کی تفصیلات کو لاگو کر سکتے ہیں اور میز کو مطلوبہ شکل میں لا سکتے ہیں۔
ہم دلیل کا استعمال کرتے ہیں۔ na.rm = TRUEکیونکہ ڈیٹا کی موجودہ شکل غیر موجود مشاہدات کے لیے اضافی قطاریں بنانے پر مجبور کرتی ہے۔ کیونکہ خاندان 2 میں صرف ایک بچہ ہے، na.rm = TRUE اس بات کی ضمانت دیتا ہے کہ فیملی 2 کی آؤٹ پٹ میں ایک قطار ہوگی۔
تاریخ کے فریموں کو لمبی سے چوڑی شکل میں تبدیل کرنا
pivot_wider() - الٹا تبدیلی ہے، اور اس کے برعکس قطاروں کی تعداد کو کم کرکے ڈیٹ فریم کے کالموں کی تعداد میں اضافہ کرتا ہے۔
ڈیٹا کو درست شکل میں لانے کے لیے اس قسم کی تبدیلی بہت کم استعمال ہوتی ہے، تاہم، یہ تکنیک پریزنٹیشنز میں استعمال ہونے والی پیوٹ ٹیبلز بنانے، یا کچھ دوسرے ٹولز کے ساتھ انضمام کے لیے مفید ہو سکتی ہے۔
دراصل افعال pivot_longer() и pivot_wider() سڈول ہیں، اور ایک دوسرے کے الٹے اعمال پیدا کرتے ہیں، یعنی: df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec) и df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec) اصل ڈی ایف واپس کر دے گا۔
ٹیبل کو وسیع فارمیٹ میں تبدیل کرنے کی آسان ترین مثال
یہ ظاہر کرنے کے لیے کہ فنکشن کیسے کام کرتا ہے۔ pivot_wider() ہم ڈیٹاسیٹ استعمال کریں گے۔ مچھلی کے_مقابلے، جو اس بارے میں معلومات کو ذخیرہ کرتا ہے کہ کس طرح مختلف اسٹیشن دریا کے ساتھ مچھلی کی نقل و حرکت کو ریکارڈ کرتے ہیں۔
#> # A tibble: 114 x 3
#> fish station seen
#> <fct> <fct> <int>
#> 1 4842 Release 1
#> 2 4842 I80_1 1
#> 3 4842 Lisbon 1
#> 4 4842 Rstr 1
#> 5 4842 Base_TD 1
#> 6 4842 BCE 1
#> 7 4842 BCW 1
#> 8 4842 BCE2 1
#> 9 4842 BCW2 1
#> 10 4842 MAE 1
#> # … with 104 more rows
زیادہ تر معاملات میں، یہ جدول زیادہ معلوماتی اور استعمال میں آسان ہو گا اگر آپ ہر سٹیشن کے لیے علیحدہ کالم میں معلومات پیش کرتے ہیں۔
fish_encounters %>% pivot_wider(names_from = station, values_from = seen)
#> # A tibble: 19 x 12
#> fish Release I80_1 Lisbon Rstr Base_TD BCE BCW BCE2 BCW2 MAE
#> <fct> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#> 1 4842 1 1 1 1 1 1 1 1 1 1
#> 2 4843 1 1 1 1 1 1 1 1 1 1
#> 3 4844 1 1 1 1 1 1 1 1 1 1
#> 4 4845 1 1 1 1 1 NA NA NA NA NA
#> 5 4847 1 1 1 NA NA NA NA NA NA NA
#> 6 4848 1 1 1 1 NA NA NA NA NA NA
#> 7 4849 1 1 NA NA NA NA NA NA NA NA
#> 8 4850 1 1 NA 1 1 1 1 NA NA NA
#> 9 4851 1 1 NA NA NA NA NA NA NA NA
#> 10 4854 1 1 NA NA NA NA NA NA NA NA
#> # … with 9 more rows, and 1 more variable: MAW <int>
یہ ڈیٹا سیٹ صرف اس وقت معلومات کو ریکارڈ کرتا ہے جب اسٹیشن کے ذریعہ مچھلیوں کا پتہ لگایا گیا ہو، یعنی اگر کسی سٹیشن کے ذریعہ کوئی مچھلی ریکارڈ نہیں کی گئی تو یہ ڈیٹا ٹیبل میں نہیں ہوگا۔ اس کا مطلب ہے کہ آؤٹ پٹ NA سے بھر جائے گا۔
تاہم، اس معاملے میں ہم جانتے ہیں کہ ریکارڈ کی عدم موجودگی کا مطلب ہے کہ مچھلی نہیں دیکھی گئی تھی، لہذا ہم اس دلیل کو استعمال کر سکتے ہیں۔ اقدار_فِل فنکشن میں pivot_wider() اور ان گمشدہ اقدار کو زیرو سے بھریں:
تصور کریں کہ ہمارے پاس ایک میز ہے جس میں مصنوعات، ملک اور سال کا مجموعہ ہے۔ ٹیسٹ کی تاریخ کا فریم بنانے کے لیے، آپ درج ذیل کوڈ کو چلا سکتے ہیں:
df <- expand_grid(
product = c("A", "B"),
country = c("AI", "EI"),
year = 2000:2014
) %>%
filter((product == "A" & country == "AI") | product == "B") %>%
mutate(value = rnorm(nrow(.)))
#> # A tibble: 45 x 4
#> product country year value
#> <chr> <chr> <int> <dbl>
#> 1 A AI 2000 -2.05
#> 2 A AI 2001 -0.676
#> 3 A AI 2002 1.60
#> 4 A AI 2003 -0.353
#> 5 A AI 2004 -0.00530
#> 6 A AI 2005 0.442
#> 7 A AI 2006 -0.610
#> 8 A AI 2007 -2.77
#> 9 A AI 2008 0.899
#> 10 A AI 2009 -0.106
#> # … with 35 more rows
ہمارا کام ڈیٹا فریم کو پھیلانا ہے تاکہ ایک کالم میں پروڈکٹ اور ملک کے ہر امتزاج کا ڈیٹا ہو۔ ایسا کرنے کے لیے، صرف دلیل میں پاس ناموں سے ایک ویکٹر جس میں ضم ہونے والے فیلڈز کے نام ہوتے ہیں۔
آپ کسی فنکشن میں وضاحتیں بھی لگا سکتے ہیں۔ pivot_wider(). لیکن جب جمع کرایا pivot_wider() تصریح مخالف تبدیلی کرتی ہے۔ pivot_longer(): میں بتائے گئے کالم نام، سے اقدار کا استعمال کرتے ہوئے .قدر اور دوسرے کالم۔
اس ڈیٹاسیٹ کے لیے، اگر آپ چاہتے ہیں کہ ہر ممکنہ ملک اور پروڈکٹ کا اپنا کالم ہو، نہ کہ صرف ڈیٹا میں موجود کالم ہوں تو آپ حسب ضرورت تفصیلات تیار کر سکتے ہیں:
#> # A tibble: 4 x 4
#> .name product country .value
#> <chr> <chr> <chr> <chr>
#> 1 A_AI A AI value
#> 2 A_EI A EI value
#> 3 B_AI B AI value
#> 4 B_EI B EI value
df %>% pivot_wider(spec = spec) %>% head()
#> # A tibble: 6 x 5
#> year A_AI A_EI B_AI B_EI
#> <int> <dbl> <dbl> <dbl> <dbl>
#> 1 2000 -2.05 NA 0.607 1.20
#> 2 2001 -0.676 NA 1.65 -0.114
#> 3 2002 1.60 NA -0.0245 0.501
#> 4 2003 -0.353 NA 1.30 -0.459
#> 5 2004 -0.00530 NA 0.921 -0.0589
#> 6 2005 0.442 NA -1.55 0.594
نئے tidyr تصور کے ساتھ کام کرنے کی کئی جدید مثالیں۔
مثال کے طور پر امریکی مردم شماری کی آمدنی اور کرایہ کے ڈیٹاسیٹ کا استعمال کرتے ہوئے ڈیٹا کو صاف کرنا۔
ڈیٹا سیٹ ہمیں_کرایہ_آمدنی 2017 کے لیے امریکہ کی ہر ریاست کے لیے اوسط آمدنی اور کرائے کی معلومات پر مشتمل ہے (پیکیج میں دستیاب ڈیٹا سیٹ صاف مردم شماری).
us_rent_income
#> # A tibble: 104 x 5
#> GEOID NAME variable estimate moe
#> <chr> <chr> <chr> <dbl> <dbl>
#> 1 01 Alabama income 24476 136
#> 2 01 Alabama rent 747 3
#> 3 02 Alaska income 32940 508
#> 4 02 Alaska rent 1200 13
#> 5 04 Arizona income 27517 148
#> 6 04 Arizona rent 972 4
#> 7 05 Arkansas income 23789 165
#> 8 05 Arkansas rent 709 5
#> 9 06 California income 29454 109
#> 10 06 California rent 1358 3
#> # … with 94 more rows
اس فارم میں جس میں ڈیٹا کو ڈیٹاسیٹ میں محفوظ کیا جاتا ہے۔ ہمیں_کرایہ_آمدنی ان کے ساتھ کام کرنا انتہائی تکلیف دہ ہے، لہذا ہم کالم کے ساتھ ڈیٹا سیٹ بنانا چاہیں گے: کرایہ پر, کرایہ_مو, کس طرح, آمدنی_moe. اس تصریح کو بنانے کے بہت سے طریقے ہیں، لیکن اہم نکتہ یہ ہے کہ ہمیں متغیر اقدار کے ہر امتزاج کو پیدا کرنے کی ضرورت ہے اور تخمینہ/moeاور پھر کالم کا نام بنائیں۔
بعض اوقات ڈیٹا سیٹ کو مطلوبہ شکل میں لانے کے لیے کئی مراحل کی ضرورت ہوتی ہے۔
ڈیٹا سیٹ ورلڈ_بینک_پاپ 2000 اور 2018 کے درمیان ہر ملک کی آبادی پر عالمی بینک کے اعداد و شمار پر مشتمل ہے۔
ہمارا مقصد ہر متغیر کے ساتھ اپنے کالم میں ایک صاف ڈیٹا سیٹ بنانا ہے۔ یہ بالکل واضح نہیں ہے کہ کن اقدامات کی ضرورت ہے، لیکن ہم سب سے واضح مسئلہ کے ساتھ شروعات کریں گے: سال متعدد کالموں میں پھیلا ہوا ہے۔
اسے ٹھیک کرنے کے لیے آپ کو فنکشن استعمال کرنے کی ضرورت ہے۔ pivot_longer().
اگلا مرحلہ اشارے متغیر کو دیکھنا ہے۔ pop2 %>% count(indicator)
#> # A tibble: 4 x 2
#> indicator n
#> <chr> <int>
#> 1 SP.POP.GROW 4752
#> 2 SP.POP.TOTL 4752
#> 3 SP.URB.GROW 4752
#> 4 SP.URB.TOTL 4752
جہاں SP.POP.GROW آبادی میں اضافہ ہے، SP.POP.TOTL کل آبادی ہے، اور SP.URB۔ * وہی چیز، لیکن صرف شہری علاقوں کے لیے۔ آئیے ان اقدار کو دو متغیروں میں تقسیم کرتے ہیں: رقبہ - رقبہ (کل یا شہری) اور ایک متغیر جس میں اصل ڈیٹا (آبادی یا نمو):
اس فہرست کو ٹیبلیٹ کرنا کافی مشکل ہے کیونکہ کوئی متغیر نہیں ہے جو اس بات کی نشاندہی کرتا ہے کہ کون سا ڈیٹا کس رابطے سے تعلق رکھتا ہے۔ ہم اسے یہ نوٹ کر کے ٹھیک کر سکتے ہیں کہ ہر نئے رابطے کا ڈیٹا "نام" سے شروع ہوتا ہے، اس لیے ہم ایک منفرد شناخت کنندہ بنا سکتے ہیں اور ہر بار جب فیلڈ کالم میں "نام" کی قدر ہوتی ہے تو اس میں ایک اضافہ کر سکتے ہیں:
#> # A tibble: 6 x 3
#> field value person_id
#> <chr> <chr> <int>
#> 1 name Jiena McLellan 1
#> 2 company Toyota 1
#> 3 name John Smith 2
#> 4 company google 2
#> 5 email [email protected] 2
#> 6 name Huxley Ratcliffe 3
اب جب کہ ہمارے پاس ہر رابطے کے لیے ایک منفرد ID ہے، ہم فیلڈ اور ویلیو کو کالم میں تبدیل کر سکتے ہیں:
#> # A tibble: 3 x 4
#> person_id name company email
#> <int> <chr> <chr> <chr>
#> 1 1 Jiena McLellan Toyota <NA>
#> 2 2 John Smith google [email protected]
#> 3 3 Huxley Ratcliffe <NA> <NA>
حاصل يہ ہوا
میری ذاتی رائے یہ ہے کہ نیا تصور صاف واقعی زیادہ بدیہی، اور فنکشنلٹی میں میراثی افعال سے نمایاں طور پر اعلیٰ spread() и gather(). مجھے امید ہے کہ اس مضمون نے آپ کو اس سے نمٹنے میں مدد کی ہے۔ pivot_longer() и pivot_wider().