R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور pivot_wider

پیکیج صاف R زبان میں سب سے زیادہ مقبول لائبریریوں میں سے ایک میں شامل - صاف ستھرا.
پیکیج کا بنیادی مقصد ڈیٹا کو درست شکل میں لانا ہے۔

Habré پر پہلے سے ہی دستیاب ہے۔ اشاعت اس پیکیج کے لیے وقف ہے، لیکن یہ 2015 کا ہے۔ اور میں آپ کو سب سے حالیہ تبدیلیوں کے بارے میں بتانا چاہتا ہوں، جن کا اعلان کچھ دن پہلے اس کے مصنف ہیڈلی وکھم نے کیا تھا۔

R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور pivot_wider

ایس جے کے: کیا 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 и اقدار_سے ان کے نام کوٹیشن مارکس میں ہونے چاہئیں۔

ایک ٹیبل جو آپ کو آسانی سے یہ معلوم کرنے میں مدد کرے گا کہ نئے تصور کے ساتھ کام کرنے کا طریقہ کیسے بنایا جائے۔ صاف.

R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور pivot_wider

مصنف کی طرف سے نوٹ

نیچے دی گئی تمام عبارت موافقت پذیر ہے، میں یہاں تک کہ مفت ترجمہ بھی کہوں گا۔ vignettes سرکاری صاف ستھری لائبریری کی ویب سائٹ سے۔

ڈیٹا کو چوڑے سے لمبے فارمیٹ میں تبدیل کرنے کی ایک سادہ مثال

pivot_longer () - کالموں کی تعداد کو کم کرکے اور قطاروں کی تعداد میں اضافہ کرکے ڈیٹا سیٹ کو طویل کرتا ہے۔

R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور pivot_wider

مضمون میں پیش کردہ مثالوں کو چلانے کے لیے، آپ کو پہلے ضروری پیکجوں کو جوڑنے کی ضرورت ہے:

library(tidyr)
library(dplyr)
library(readr)

ہم کہتے ہیں کہ ہمارے پاس سروے کے نتائج کے ساتھ ایک ٹیبل ہے جس میں (دوسری چیزوں کے علاوہ) لوگوں سے ان کے مذہب اور سالانہ آمدنی کے بارے میں پوچھا گیا:

#> # A tibble: 18 x 11
#>    religion `<$10k` `$10-20k` `$20-30k` `$30-40k` `$40-50k` `$50-75k`
#>    <chr>      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>
#>  1 Agnostic      27        34        60        81        76       137
#>  2 Atheist       12        27        37        52        35        70
#>  3 Buddhist      27        21        30        34        33        58
#>  4 Catholic     418       617       732       670       638      1116
#>  5 Don’t k…      15        14        15        11        10        35
#>  6 Evangel…     575       869      1064       982       881      1486
#>  7 Hindu          1         9         7         9        11        34
#>  8 Histori…     228       244       236       238       197       223
#>  9 Jehovah…      20        27        24        24        21        30
#> 10 Jewish        19        19        25        25        30        95
#> # … with 8 more rows, and 4 more variables: `$75-100k` <dbl>,
#> #   `$100-150k` <dbl>, `>150k` <dbl>, `Don't know/refused` <dbl>

اس جدول میں جواب دہندگان کے مذہب کا ڈیٹا قطاروں میں ہے، اور آمدنی کی سطح کالم کے ناموں میں بکھری ہوئی ہے۔ ہر زمرے کے جواب دہندگان کی تعداد کو سیل ویلیوز میں مذہب اور آمدنی کی سطح کے بیچ میں محفوظ کیا جاتا ہے۔ میز کو صاف، درست شکل میں لانے کے لیے، اسے استعمال کرنا کافی ہے۔ pivot_longer():

pew %>% 
  pivot_longer(cols = -religion, names_to = "income", values_to = "count")

pew %>% 
  pivot_longer(cols = -religion, names_to = "income", values_to = "count")
#> # A tibble: 180 x 3
#>    religion income             count
#>    <chr>    <chr>              <dbl>
#>  1 Agnostic <$10k                 27
#>  2 Agnostic $10-20k               34
#>  3 Agnostic $20-30k               60
#>  4 Agnostic $30-40k               81
#>  5 Agnostic $40-50k               76
#>  6 Agnostic $50-75k              137
#>  7 Agnostic $75-100k             122
#>  8 Agnostic $100-150k            109
#>  9 Agnostic >150k                 84
#> 10 Agnostic Don't know/refused    96
#> # … with 170 more rows

فنکشن دلائل 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")

#> # A tibble: 56 x 3
#>    .name        .value name        
#>    <chr>        <chr>  <chr>       
#>  1 new_sp_m014  count  new_sp_m014 
#>  2 new_sp_m1524 count  new_sp_m1524
#>  3 new_sp_m2534 count  new_sp_m2534
#>  4 new_sp_m3544 count  new_sp_m3544
#>  5 new_sp_m4554 count  new_sp_m4554
#>  6 new_sp_m5564 count  new_sp_m5564
#>  7 new_sp_m65   count  new_sp_m65  
#>  8 new_sp_f014  count  new_sp_f014 
#>  9 new_sp_f1524 count  new_sp_f1524
#> 10 new_sp_f2534 count  new_sp_f2534
#> # … with 46 more rows

قطعات ملک, isoxnumx, isoxnumx پہلے سے ہی متغیر ہیں۔ ہمارا کام کالموں کو پلٹنا ہے۔ new_sp_m014 پر newrel_f65.

ان کالموں کے نام درج ذیل معلومات کو محفوظ کرتے ہیں:

  • سابقہ new_ اشارہ کرتا ہے کہ کالم میں تپ دق کے نئے کیسز کا ڈیٹا موجود ہے، موجودہ تاریخ کے فریم میں صرف نئی بیماریوں کے متعلق معلومات ہیں، اس لیے موجودہ تناظر میں یہ سابقہ ​​کوئی معنی نہیں رکھتا۔
  • sp/rel/sp/ep بیماری کی تشخیص کا طریقہ بیان کرتا ہے۔
  • m/f مریض کی جنس.
  • 014/1524/2535/3544/4554/65 مریض کی عمر کی حد.

ہم فنکشن کا استعمال کرتے ہوئے ان کالموں کو تقسیم کر سکتے ہیں۔ extract()باقاعدہ اظہار کا استعمال کرتے ہوئے.

spec <- spec %>%
        extract(name, c("diagnosis", "gender", "age"), "new_?(.*)_(.)(.*)")

#> # A tibble: 56 x 5
#>    .name        .value diagnosis gender age  
#>    <chr>        <chr>  <chr>     <chr>  <chr>
#>  1 new_sp_m014  count  sp        m      014  
#>  2 new_sp_m1524 count  sp        m      1524 
#>  3 new_sp_m2534 count  sp        m      2534 
#>  4 new_sp_m3544 count  sp        m      3544 
#>  5 new_sp_m4554 count  sp        m      4554 
#>  6 new_sp_m5564 count  sp        m      5564 
#>  7 new_sp_m65   count  sp        m      65   
#>  8 new_sp_f014  count  sp        f      014  
#>  9 new_sp_f1524 count  sp        f      1524 
#> 10 new_sp_f2534 count  sp        f      2534 
#> # … with 46 more rows

براہ کرم کالم نوٹ کریں۔ نام اس میں کوئی تبدیلی نہیں ہونی چاہیے کیونکہ یہ اصل ڈیٹا سیٹ کے کالم ناموں میں ہمارا انڈیکس ہے۔

جنس اور عمر (کالم صنفی и عمر) میں طے شدہ اور معلوم قدریں ہیں، لہذا ان کالموں کو عوامل میں تبدیل کرنے کی سفارش کی جاتی ہے:

spec <-  spec %>%
            mutate(
              gender = factor(gender, levels = c("f", "m")),
              age = factor(age, levels = unique(age), ordered = TRUE)
            ) 

آخر میں، تصریح کو لاگو کرنے کے لیے جو ہم نے اصل تاریخ کے فریم پر بنائی ہے۔ جو ہمیں ایک دلیل استعمال کرنے کی ضرورت ہے۔ نمونہ فنکشن میں 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

ہم نے جو کچھ بھی کیا ہے اس کی خاکہ نگاری اس طرح کی جا سکتی ہے:

R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور pivot_wider

متعدد اقدار کا استعمال کرتے ہوئے تفصیلات (.value)

مندرجہ بالا مثال میں، تفصیلات کالم .قدر صرف ایک قدر پر مشتمل ہے، زیادہ تر معاملات میں ایسا ہی ہوتا ہے۔

لیکن کبھی کبھار ایسی صورت حال پیدا ہو سکتی ہے جب آپ کو کالموں سے ڈیٹا اکٹھا کرنے کی ضرورت ہوتی ہے جس میں مختلف ڈیٹا کی اقسام ہوتی ہیں۔ میراثی فنکشن استعمال کرنا spread() یہ کرنا کافی مشکل ہو گا.

ذیل کی مثال سے لی گئی ہے۔ vignettes پیکج کو ڈیٹا ٹیبل.

آئیے ایک تربیتی ڈیٹا فریم بنائیں۔

family <- tibble::tribble(
  ~family,  ~dob_child1,  ~dob_child2, ~gender_child1, ~gender_child2,
       1L, "1998-11-26", "2000-01-29",             1L,             2L,
       2L, "1996-06-22",           NA,             2L,             NA,
       3L, "2002-07-11", "2004-04-05",             2L,             2L,
       4L, "2004-10-10", "2009-08-27",             1L,             1L,
       5L, "2000-12-05", "2005-02-28",             2L,             1L,
)
family <- family %>% mutate_at(vars(starts_with("dob")), parse_date)

#> # A tibble: 5 x 5
#>   family dob_child1 dob_child2 gender_child1 gender_child2
#>    <int> <date>     <date>             <int>         <int>
#> 1      1 1998-11-26 2000-01-29             1             2
#> 2      2 1996-06-22 NA                     2            NA
#> 3      3 2002-07-11 2004-04-05             2             2
#> 4      4 2004-10-10 2009-08-27             1             1
#> 5      5 2000-12-05 2005-02-28             2             1

بنائے گئے ڈیٹ فریم میں ہر قطار میں ایک خاندان کے بچوں کا ڈیٹا ہوتا ہے۔ خاندانوں میں ایک یا دو بچے ہو سکتے ہیں۔ ہر بچے کے لیے، تاریخ پیدائش اور جنس پر ڈیٹا فراہم کیا جاتا ہے، اور ہر بچے کا ڈیٹا الگ الگ کالموں میں ہوتا ہے؛ ہمارا کام اس ڈیٹا کو تجزیہ کے لیے درست شکل میں لانا ہے۔

براہ کرم نوٹ کریں کہ ہمارے پاس ہر بچے کے بارے میں معلومات کے ساتھ دو متغیرات ہیں: ان کی جنس اور تاریخ پیدائش (سابقہ ​​کے ساتھ کالم 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)) - فیلڈ کی اقدار کو تبدیل کریں۔ بچے متن سے عددی ڈیٹا کی قسم تک۔

اب ہم اصل ڈیٹا فریم پر نتیجے کی تفصیلات کو لاگو کر سکتے ہیں اور میز کو مطلوبہ شکل میں لا سکتے ہیں۔

family %>% 
    pivot_longer(spec = spec, na.rm = T)

#> # A tibble: 9 x 4
#>   family child dob        gender
#>    <int> <dbl> <date>      <int>
#> 1      1     1 1998-11-26      1
#> 2      1     2 2000-01-29      2
#> 3      2     1 1996-06-22      2
#> 4      3     1 2002-07-11      2
#> 5      3     2 2004-04-05      2
#> 6      4     1 2004-10-10      1
#> 7      4     2 2009-08-27      1
#> 8      5     1 2000-12-05      2
#> 9      5     2 2005-02-28      1

ہم دلیل کا استعمال کرتے ہیں۔ na.rm = TRUEکیونکہ ڈیٹا کی موجودہ شکل غیر موجود مشاہدات کے لیے اضافی قطاریں بنانے پر مجبور کرتی ہے۔ کیونکہ خاندان 2 میں صرف ایک بچہ ہے، na.rm = TRUE اس بات کی ضمانت دیتا ہے کہ فیملی 2 کی آؤٹ پٹ میں ایک قطار ہوگی۔

تاریخ کے فریموں کو لمبی سے چوڑی شکل میں تبدیل کرنا

pivot_wider() - الٹا تبدیلی ہے، اور اس کے برعکس قطاروں کی تعداد کو کم کرکے ڈیٹ فریم کے کالموں کی تعداد میں اضافہ کرتا ہے۔

R پیکیج tidyr اور اس کے نئے فنکشنز pivot_longer اور 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)

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() اور ان گمشدہ اقدار کو زیرو سے بھریں:

fish_encounters %>% pivot_wider(
  names_from = station, 
  values_from = seen,
  values_fill = list(seen = 0)
)

#> # 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     0     0     0     0     0
#>  5 4847        1     1      1     0       0     0     0     0     0     0
#>  6 4848        1     1      1     1       0     0     0     0     0     0
#>  7 4849        1     1      0     0       0     0     0     0     0     0
#>  8 4850        1     1      0     1       1     1     1     0     0     0
#>  9 4851        1     1      0     0       0     0     0     0     0     0
#> 10 4854        1     1      0     0       0     0     0     0     0     0
#> # … with 9 more rows, and 1 more variable: MAW <int>

متعدد ماخذ متغیرات سے کالم کا نام تیار کرنا

تصور کریں کہ ہمارے پاس ایک میز ہے جس میں مصنوعات، ملک اور سال کا مجموعہ ہے۔ ٹیسٹ کی تاریخ کا فریم بنانے کے لیے، آپ درج ذیل کوڈ کو چلا سکتے ہیں:

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

ہمارا کام ڈیٹا فریم کو پھیلانا ہے تاکہ ایک کالم میں پروڈکٹ اور ملک کے ہر امتزاج کا ڈیٹا ہو۔ ایسا کرنے کے لیے، صرف دلیل میں پاس ناموں سے ایک ویکٹر جس میں ضم ہونے والے فیلڈز کے نام ہوتے ہیں۔

df %>% pivot_wider(names_from = c(product, country),
                 values_from = "value")

#> # A tibble: 15 x 4
#>     year     A_AI    B_AI    B_EI
#>    <int>    <dbl>   <dbl>   <dbl>
#>  1  2000 -2.05     0.607   1.20  
#>  2  2001 -0.676    1.65   -0.114 
#>  3  2002  1.60    -0.0245  0.501 
#>  4  2003 -0.353    1.30   -0.459 
#>  5  2004 -0.00530  0.921  -0.0589
#>  6  2005  0.442   -1.55    0.594 
#>  7  2006 -0.610    0.380  -1.28  
#>  8  2007 -2.77     0.830   0.637 
#>  9  2008  0.899    0.0175 -1.30  
#> 10  2009 -0.106   -0.195   1.03  
#> # … with 5 more rows

آپ کسی فنکشن میں وضاحتیں بھی لگا سکتے ہیں۔ pivot_wider(). لیکن جب جمع کرایا pivot_wider() تصریح مخالف تبدیلی کرتی ہے۔ pivot_longer(): میں بتائے گئے کالم نام، سے اقدار کا استعمال کرتے ہوئے .قدر اور دوسرے کالم۔

اس ڈیٹاسیٹ کے لیے، اگر آپ چاہتے ہیں کہ ہر ممکنہ ملک اور پروڈکٹ کا اپنا کالم ہو، نہ کہ صرف ڈیٹا میں موجود کالم ہوں تو آپ حسب ضرورت تفصیلات تیار کر سکتے ہیں:

spec <- df %>% 
  expand(product, country, .value = "value") %>% 
  unite(".name", product, country, remove = FALSE)

#> # 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اور پھر کالم کا نام بنائیں۔

  spec <- us_rent_income %>% 
    expand(variable, .value = c("estimate", "moe")) %>% 
    mutate(
      .name = paste0(variable, ifelse(.value == "moe", "_moe", ""))
    )

#> # A tibble: 4 x 3
#>   variable .value   .name     
#>   <chr>    <chr>    <chr>     
#> 1 income   estimate income    
#> 2 income   moe      income_moe
#> 3 rent     estimate rent      
#> 4 rent     moe      rent_moe

یہ تفصیلات فراہم کرنا pivot_wider() ہمیں وہ نتیجہ دیتا ہے جس کی ہم تلاش کر رہے ہیں:

us_rent_income %>% pivot_wider(spec = spec)

#> # A tibble: 52 x 6
#>    GEOID NAME                 income income_moe  rent rent_moe
#>    <chr> <chr>                 <dbl>      <dbl> <dbl>    <dbl>
#>  1 01    Alabama               24476        136   747        3
#>  2 02    Alaska                32940        508  1200       13
#>  3 04    Arizona               27517        148   972        4
#>  4 05    Arkansas              23789        165   709        5
#>  5 06    California            29454        109  1358        3
#>  6 08    Colorado              32401        109  1125        5
#>  7 09    Connecticut           35326        195  1123        5
#>  8 10    Delaware              31560        247  1076       10
#>  9 11    District of Columbia  43198        681  1424       17
#> 10 12    Florida               25952         70  1077        3
#> # … with 42 more rows

ورلڈ بینک

بعض اوقات ڈیٹا سیٹ کو مطلوبہ شکل میں لانے کے لیے کئی مراحل کی ضرورت ہوتی ہے۔
ڈیٹا سیٹ ورلڈ_بینک_پاپ 2000 اور 2018 کے درمیان ہر ملک کی آبادی پر عالمی بینک کے اعداد و شمار پر مشتمل ہے۔

#> # A tibble: 1,056 x 20
#>    country indicator `2000` `2001` `2002` `2003`  `2004`  `2005`   `2006`
#>    <chr>   <chr>      <dbl>  <dbl>  <dbl>  <dbl>   <dbl>   <dbl>    <dbl>
#>  1 ABW     SP.URB.T… 4.24e4 4.30e4 4.37e4 4.42e4 4.47e+4 4.49e+4  4.49e+4
#>  2 ABW     SP.URB.G… 1.18e0 1.41e0 1.43e0 1.31e0 9.51e-1 4.91e-1 -1.78e-2
#>  3 ABW     SP.POP.T… 9.09e4 9.29e4 9.50e4 9.70e4 9.87e+4 1.00e+5  1.01e+5
#>  4 ABW     SP.POP.G… 2.06e0 2.23e0 2.23e0 2.11e0 1.76e+0 1.30e+0  7.98e-1
#>  5 AFG     SP.URB.T… 4.44e6 4.65e6 4.89e6 5.16e6 5.43e+6 5.69e+6  5.93e+6
#>  6 AFG     SP.URB.G… 3.91e0 4.66e0 5.13e0 5.23e0 5.12e+0 4.77e+0  4.12e+0
#>  7 AFG     SP.POP.T… 2.01e7 2.10e7 2.20e7 2.31e7 2.41e+7 2.51e+7  2.59e+7
#>  8 AFG     SP.POP.G… 3.49e0 4.25e0 4.72e0 4.82e0 4.47e+0 3.87e+0  3.23e+0
#>  9 AGO     SP.URB.T… 8.23e6 8.71e6 9.22e6 9.77e6 1.03e+7 1.09e+7  1.15e+7
#> 10 AGO     SP.URB.G… 5.44e0 5.59e0 5.70e0 5.76e0 5.75e+0 5.69e+0  4.92e+0
#> # … with 1,046 more rows, and 11 more variables: `2007` <dbl>,
#> #   `2008` <dbl>, `2009` <dbl>, `2010` <dbl>, `2011` <dbl>, `2012` <dbl>,
#> #   `2013` <dbl>, `2014` <dbl>, `2015` <dbl>, `2016` <dbl>, `2017` <dbl>

ہمارا مقصد ہر متغیر کے ساتھ اپنے کالم میں ایک صاف ڈیٹا سیٹ بنانا ہے۔ یہ بالکل واضح نہیں ہے کہ کن اقدامات کی ضرورت ہے، لیکن ہم سب سے واضح مسئلہ کے ساتھ شروعات کریں گے: سال متعدد کالموں میں پھیلا ہوا ہے۔

اسے ٹھیک کرنے کے لیے آپ کو فنکشن استعمال کرنے کی ضرورت ہے۔ pivot_longer().

pop2 <- world_bank_pop %>% 
  pivot_longer(`2000`:`2017`, names_to = "year")

#> # A tibble: 19,008 x 4
#>    country indicator   year  value
#>    <chr>   <chr>       <chr> <dbl>
#>  1 ABW     SP.URB.TOTL 2000  42444
#>  2 ABW     SP.URB.TOTL 2001  43048
#>  3 ABW     SP.URB.TOTL 2002  43670
#>  4 ABW     SP.URB.TOTL 2003  44246
#>  5 ABW     SP.URB.TOTL 2004  44669
#>  6 ABW     SP.URB.TOTL 2005  44889
#>  7 ABW     SP.URB.TOTL 2006  44881
#>  8 ABW     SP.URB.TOTL 2007  44686
#>  9 ABW     SP.URB.TOTL 2008  44375
#> 10 ABW     SP.URB.TOTL 2009  44052
#> # … with 18,998 more rows

اگلا مرحلہ اشارے متغیر کو دیکھنا ہے۔
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۔ * وہی چیز، لیکن صرف شہری علاقوں کے لیے۔ آئیے ان اقدار کو دو متغیروں میں تقسیم کرتے ہیں: رقبہ - رقبہ (کل یا شہری) اور ایک متغیر جس میں اصل ڈیٹا (آبادی یا نمو):

pop3 <- pop2 %>% 
  separate(indicator, c(NA, "area", "variable"))

#> # A tibble: 19,008 x 5
#>    country area  variable year  value
#>    <chr>   <chr> <chr>    <chr> <dbl>
#>  1 ABW     URB   TOTL     2000  42444
#>  2 ABW     URB   TOTL     2001  43048
#>  3 ABW     URB   TOTL     2002  43670
#>  4 ABW     URB   TOTL     2003  44246
#>  5 ABW     URB   TOTL     2004  44669
#>  6 ABW     URB   TOTL     2005  44889
#>  7 ABW     URB   TOTL     2006  44881
#>  8 ABW     URB   TOTL     2007  44686
#>  9 ABW     URB   TOTL     2008  44375
#> 10 ABW     URB   TOTL     2009  44052
#> # … with 18,998 more rows

اب ہمیں صرف متغیر کو دو کالموں میں تقسیم کرنا ہے:

pop3 %>% 
  pivot_wider(names_from = variable, values_from = value)

#> # A tibble: 9,504 x 5
#>    country area  year   TOTL    GROW
#>    <chr>   <chr> <chr> <dbl>   <dbl>
#>  1 ABW     URB   2000  42444  1.18  
#>  2 ABW     URB   2001  43048  1.41  
#>  3 ABW     URB   2002  43670  1.43  
#>  4 ABW     URB   2003  44246  1.31  
#>  5 ABW     URB   2004  44669  0.951 
#>  6 ABW     URB   2005  44889  0.491 
#>  7 ABW     URB   2006  44881 -0.0178
#>  8 ABW     URB   2007  44686 -0.435 
#>  9 ABW     URB   2008  44375 -0.698 
#> 10 ABW     URB   2009  44052 -0.731 
#> # … with 9,494 more rows

رابطہ کی فہرست

ایک آخری مثال، تصور کریں کہ آپ کے پاس ایک رابطہ فہرست ہے جسے آپ نے کسی ویب سائٹ سے کاپی اور پیسٹ کیا ہے:

contacts <- tribble(
  ~field, ~value,
  "name", "Jiena McLellan",
  "company", "Toyota", 
  "name", "John Smith", 
  "company", "google", 
  "email", "[email protected]",
  "name", "Huxley Ratcliffe"
)

اس فہرست کو ٹیبلیٹ کرنا کافی مشکل ہے کیونکہ کوئی متغیر نہیں ہے جو اس بات کی نشاندہی کرتا ہے کہ کون سا ڈیٹا کس رابطے سے تعلق رکھتا ہے۔ ہم اسے یہ نوٹ کر کے ٹھیک کر سکتے ہیں کہ ہر نئے رابطے کا ڈیٹا "نام" سے شروع ہوتا ہے، اس لیے ہم ایک منفرد شناخت کنندہ بنا سکتے ہیں اور ہر بار جب فیلڈ کالم میں "نام" کی قدر ہوتی ہے تو اس میں ایک اضافہ کر سکتے ہیں:

contacts <- contacts %>% 
  mutate(
    person_id = cumsum(field == "name")
  )
contacts

#> # 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 ہے، ہم فیلڈ اور ویلیو کو کالم میں تبدیل کر سکتے ہیں:

contacts %>% 
  pivot_wider(names_from = field, values_from = value)

#> # 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().

ماخذ: www.habr.com

نیا تبصرہ شامل کریں