آر پیکج tidyr او د هغې نوې دندې pivot_longer او pivot_wider

کڅوړه منظم په R ژبه کې یو له خورا مشهور کتابتونونو څخه په اصلي کې شامل دی - منظم.
د کڅوړې اصلي هدف دا دی چې معلومات په دقیق شکل کې راوړي.

لا دمخه په Habré کې شتون لري خپرونه دې کڅوړې ته وقف شوی ، مګر دا د 2015 پورې نیټه ده. او زه غواړم تاسو ته د ډیرو اوسنیو بدلونونو په اړه ووایم، کوم چې څو ورځې وړاندې د دې لیکوال هیډلي ویکم لخوا اعلان شوي.

آر پیکج tidyr او د هغې نوې دندې pivot_longer او pivot_wider

S.J.K.: آیا راټولول () او خپرول () به ضایع شي؟

هیډلي ویکم: تر یو حده. موږ به نور د دې دندو کارولو وړاندیز ونه کړو او په دوی کې بګونه حل کړو ، مګر دوی به په خپل اوسني حالت کې په کڅوړه کې شتون ته دوام ورکړي.

منځپانګې

که تاسو د معلوماتو تحلیل سره علاقه لرئ ، تاسو ممکن زما سره علاقه ولرئ telegram и یوتیوب چینلونه ډیری مینځپانګه د R ژبې ته وقف شوې ده.

د TidyData مفهوم

هدف منظم - تاسو سره مرسته وکړئ چې معلومات په تش په نامه پاک فارم ته راوړو. پاک معلومات هغه معلومات دي چیرې چې:

  • هر متغیر په کالم کې دی.
  • هر مشاهده یو تار دی.
  • هر ارزښت یو حجره ده.

دا د ډیټا سره کار کول خورا اسانه او ډیر اسانه دي چې د تحلیل ترسره کولو پرمهال په منظم ډیټا کې وړاندې کیږي.

اصلي دندې په ټیډیر کڅوړه کې شاملې دي

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 کې د کڅوړې dev نسخه کې شتون لري.

نوي ځانګړتیاو ته لیږد

په حقیقت کې، د نویو دندو سره کار کولو لپاره د زړو سکریپټونو لیږدول ستونزمن ندي؛ د ښه پوهیدو لپاره، زه به د پخوانیو دندو اسنادو څخه یوه بیلګه واخلم او وښیم چې څنګه ورته عملیات د نویو په کارولو سره ترسره کیږي. 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()په اصلي جدول کې زیرمې هیڅ کالم په دلیلونو کې لیست شوي ندي نومونه_ته и ارزښتونه_ته د دوی نومونه باید د حوالې نښه وي.

یو میز چې تاسو سره به په اسانۍ سره مرسته وکړي چې څنګه د نوي مفهوم سره کار کولو ته لاړشئ منظم.

آر پیکج tidyr او د هغې نوې دندې pivot_longer او pivot_wider

د لیکوال څخه یادونه

لاندې ټول متن تطابق دی، زه به حتی وړیا ژباړه ووایم vignettes د رسمي پاک کتابتون ویب پاڼې څخه.

د پراخه څخه اوږد فارمیټ ته د معلوماتو بدلولو ساده مثال

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

  • لومړی دلیل کالرونه، تشریح کوي چې کوم کالمونه باید یوځای شي. په دې حالت کې، ټول کالمونه پرته وخت.
  • دلیل نومونه_ته د متغیر نوم ورکوي چې د هغه کالمونو له نومونو څخه رامینځته کیږي چې موږ یې یوځای کړي.
  • ارزښتونه_ته د یو متغیر نوم ورکوي چې د یوځای شوي کالمونو حجرو ارزښتونو کې زیرمه شوي ډیټا څخه رامینځته کیږي.

نرخونه

دا د کڅوړې نوی فعالیت دی منظم، کوم چې دمخه شتون نلري کله چې د میراث دندو سره کار کوي.

یو مشخصات د ډیټا چوکاټ دی، چې هر قطار یې د نوي محصول نیټې چوکاټ کې یو کالم سره مطابقت لري، او دوه ځانګړي کالمونه چې پیل کیږي:

  • نوم د اصلي کالم نوم لري.
  • ارزښت د کالم نوم لري چې د حجرو ارزښتونه لري.

د مشخصاتو پاتې کالمونه منعکس کوي چې څنګه نوی کالم به د فشار شوي کالمونو نوم ښکاره کړي نوم.

مشخصات د کالم نوم کې ذخیره شوي میټاډاټا تشریح کوي، د هر کالم لپاره یو قطار او د هر متغیر لپاره یو کالم، د کالم نوم سره یوځای، دا تعریف ممکن په اوس وخت کې ګډوډ ښکاري، مګر د یو څو مثالونو په کتلو سره به ډیر شي. روښانه

د مشخصاتو نقطه دا ده چې تاسو کولی شئ د ډیټا فریم بدلولو لپاره نوي میټاډاټا بیرته ترلاسه کړئ ، تعدیل کړئ او تعریف کړئ.

د مشخصاتو سره کار کولو لپاره کله چې جدول له پراخه فارمیټ څخه اوږد فارمیټ ته واړوئ ، فنکشن وکاروئ 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 بسته ته data.table.

راځئ چې د روزنې ډیټا چوکاټ جوړ کړو.

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

د جوړ شوي نیټې چوکاټ په هر قطار کې د یوې کورنۍ د ماشومانو معلومات لري. کورنۍ ممکن یو یا دوه ماشومان ولري. د هر ماشوم لپاره، د زیږون او جنسیت په اړه معلومات چمتو شوي، او د هر ماشوم لپاره ډاټا په جلا کالمونو کې دي؛ زموږ دنده دا ده چې دا ډاټا د تحلیل لپاره سم شکل ته راوړو.

مهرباني وکړئ په یاد ولرئ چې موږ د هر ماشوم په اړه د معلوماتو سره دوه متغیرونه لرو: د دوی جنس او ​​د زیږون نیټه (د مخکیني کالمونه ډوپ د زیږون نیټه، د مخکیني کالمونو سره جندر د ماشوم جنس لري). متوقع پایله دا ده چې دوی باید په جلا کالمونو کې څرګند شي. موږ کولی شو دا د یو مشخصاتو په رامینځته کولو سره ترسره کړو په کوم کې چې کالم .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() - برعکس بدلون دی، او برعکس د قطارونو شمیر کمولو سره د نیټې چوکاټ د کالمونو شمیر زیاتوي.

آر پیکج 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 سره ډک شي.

په هرصورت، پدې حالت کې موږ پوهیږو چې د ریکارډ نشتوالی پدې معنی دی چې کب نه و لیدل شوی، نو موږ کولی شو دلیل وکاروو ارزښتونه_ ډکول په فعالیت کې 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

د نوي ټیډیر مفهوم سره د کار کولو څو پرمختللي مثالونه

د مثال په توګه د متحده ایالاتو د سرشمیرنې عاید او کرایه ډیټا سیټ په کارولو سره د معلوماتو پاکول.

د معلوماتو ترتیب موږ_کرایه_عايد د 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او بیا د کالم نوم پیدا کړئ.

  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

Add a comment