آر پيڪيج tidyr ۽ ان جا نوان فنڪشن pivot_longer ۽ pivot_wider

پيڪ صاف سٿرو آر ٻولي ۾ سڀ کان وڌيڪ مشهور لائبريرين جي بنيادي ۾ شامل آهي - صاف سٿرو.
پيڪيج جو بنيادي مقصد ڊيٽا کي صحيح شڪل ۾ آڻڻ آهي.

Habré تي اڳ ۾ ئي موجود آهي اشاعت هن پيڪيج لاء وقف ڪيو ويو، پر اهو 2015 تائين واپس اچي ٿو. ۽ مان توهان کي سڀ کان وڌيڪ موجوده تبديلين بابت ٻڌائڻ چاهيان ٿو، جن جو اعلان ڪجهه ڏينهن اڳ ڪيو ويو هو ان جي ليکڪ، هيڊلي وِڪم.

آر پيڪيج tidyr ۽ ان جا نوان فنڪشن pivot_longer ۽ pivot_wider

ايس جي: gather() ۽ spread() کي ختم ڪيو ويندو؟

هيڊلي ويڪھم: ڪنهن حد تائين. اسان هاڻي انهن ڪمن جي استعمال جي سفارش نه ڪنداسين ۽ انهن ۾ بگ کي درست ڪنداسين، پر اهي جاري رهندا پيڪيج ۾ انهن جي موجوده حالت ۾.

Contents

جيڪڏهن توهان ڊيٽا جي تجزيي ۾ دلچسپي رکو ٿا، توهان کي شايد دلچسپي وٺندي منهنجي ٽيليگرام и يوٽيوب چينل گهڻو ڪري مواد آر ٻولي لاء وقف آهي.

TidyData تصور

گول صاف سٿرو - توھان جي مدد ڪريو ڊيٽا کي ھڪ نام نهاد صاف فارم ۾ آڻڻ. صاف ڊيٽا ڊيٽا آهي جتي:

  • هر متغير هڪ ڪالمن ۾ آهي.
  • هر مشاهدو هڪ تار آهي.
  • هر قدر هڪ سيل آهي.

اهو ڊيٽا سان ڪم ڪرڻ تمام آسان ۽ وڌيڪ آسان آهي جيڪو تجزيو ڪرڻ دوران صاف ڊيٽا ۾ پيش ڪيو ويو آهي.

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()، اصل جدول ۾ اسٽاڪ ڪو به ڪالم دليلن ۾ درج ناهي نالا_ ڏانهن и values_to انهن جا نالا اقتباس جي نشانين ۾ هجڻ گهرجن.

هڪ ٽيبل جيڪا توهان کي آساني سان معلوم ڪرڻ ۾ مدد ڪندي ته نئين تصور سان ڪم ڪرڻ لاءِ ڪيئن سوئچ ڪجي صاف سٿرو.

آر پيڪيج tidyr ۽ ان جا نوان فنڪشن pivot_longer ۽ pivot_wider

ليکڪ کان نوٽ

هيٺ ڏنل سڀ متن موافقت آهي، مان به چوان ٿو مفت ترجمو vignettes سرڪاري tidyverse لائبريري ويب سائيٽ تان.

ڊيٽا کي وسيع کان ڊگھي شڪل ۾ تبديل ڪرڻ جو ھڪڙو سادو مثال

pivot_longer () - ڪالمن جي تعداد کي گھٽائڻ ۽ قطارن جي تعداد کي وڌائڻ سان ڊيٽا سيٽ کي ڊگھو ڪري ٿو.

آر پيڪيج 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()

  • پهريون دليل ڪالون، بيان ڪري ٿو ته ڪهڙن ڪالمن کي ملائڻ جي ضرورت آهي. انهي حالت ۾، سڀ ڪالمن کان سواء وقت.
  • دليل نالا_ ڏانهن variable جو نالو ڏئي ٿو جيڪو ڪالمن جي نالن مان ٺاهيو ويندو جيڪو اسان جوڙيو آهي.
  • values_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

جيڪو ڪجھ اسان ڪيو آھي سو ھيٺ ڏنل طريقي سان بيان ڪري سگھجي ٿو:

آر پيڪيج 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() - هڪ inverse transformation آهي، ۽ ان جي برعڪس تاريخ جي فريم جي ڪالمن جو تعداد وڌائي ٿو قطارن جو تعداد گھٽائي.

آر پيڪيج 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) اصل df واپس ڪندو.

ٽيبل کي وسيع فارميٽ ۾ تبديل ڪرڻ جو آسان مثال

ظاهر ڪرڻ لاءِ ته فنڪشن ڪيئن ڪم ڪري ٿو 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 سان ڀريو ويندو.

بهرحال، هن معاملي ۾ اسان ڄاڻون ٿا ته رڪارڊ جي غير موجودگي جو مطلب آهي ته مڇيء کي نه ڏٺو ويو، تنهنڪري اسان دليل استعمال ڪري سگهون ٿا. values_fill فنڪشن ۾ 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 تصور سان ڪم ڪرڻ جا ڪيترائي ترقي يافته مثال

مثال طور يو ايس جي مردم شماري آمدني ۽ ڪرائي تي ڊيٽا سيٽ استعمال ڪندي ڊيٽا کي صاف ڪرڻ.

ڊيٽا سيٽ us_rent_income 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

فارم ۾ جنهن ۾ ڊيٽا ڊيٽا سيٽ ۾ ذخيرو ٿيل آهي us_rent_income انهن سان گڏ ڪم ڪرڻ انتهائي مشڪل آهي، تنهنڪري اسان ڪالمن سان ڊيٽا سيٽ ٺاهڻ چاهيون ٿا: ڪرايو, rent_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

هن specification مهيا ڪرڻ 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

ورلڊ بينڪ

ڪڏهن ڪڏهن ڊيٽا سيٽ کي گهربل فارم ۾ آڻڻ لاء ڪيترن ئي قدمن جي ضرورت آهي.
ڊيٽا سيٽ world_bank_pop 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

تبصرو شامل ڪريو