R ጥቅል tidyr እና አዲሶቹ ተግባራቶቹ pivot_long and pivot_wider

ጥቅል tidyr በ R ቋንቋ ውስጥ ካሉት በጣም ታዋቂ ቤተ-መጻሕፍት ዋና ክፍል ውስጥ ተካትቷል - ሥርዓታማ.
የጥቅሉ ዋና ዓላማ መረጃውን ወደ ትክክለኛ ቅጽ ማምጣት ነው።

ቀድሞውንም ሀበሬ ላይ ህትመት ለዚህ እሽግ የተወሰነ ቢሆንም በ 2015 ነው የተጀመረው። እና ከጥቂት ቀናት በፊት በደራሲው በሄድሊ ዊክሃም ስለታወጁት በጣም ወቅታዊ ለውጦች ልነግርዎ እፈልጋለሁ።

R ጥቅል tidyr እና አዲሶቹ ተግባራቶቹ pivot_long and pivot_wider

ኤስመሰብሰብ () እና መስፋፋት () ይቋረጣል?

Hadley Wickham: በተወሰነ መጠን. ከአሁን በኋላ እነዚህን ተግባራት እንዲጠቀሙ አንመክርም እና በውስጣቸው ያሉ ስህተቶችን አስተካክል, ነገር ግን አሁን ባለው ሁኔታ በጥቅሉ ውስጥ መኖራቸውን ይቀጥላሉ.

ይዘቶች

የውሂብ ትንተና ላይ ፍላጎት ካሎት የእኔን ሊፈልጉ ይችላሉ ቴሌግራም и youtube ቻናሎች. አብዛኛው ይዘቱ ለ R ቋንቋ የተወሰነ ነው።

TidyData ጽንሰ-ሐሳብ

ግብ tidyr - ውሂቡን ንፁህ ተብሎ ወደሚጠራው ቅጽ ለማምጣት ያግዝዎታል። ንፁህ ውሂብ የተገኘበት ውሂብ ነው፡-

  • እያንዳንዱ ተለዋዋጭ በአንድ አምድ ውስጥ ነው.
  • እያንዳንዱ ምልከታ ሕብረቁምፊ ነው።
  • እያንዳንዱ እሴት ሕዋስ ነው።

ትንታኔ በሚሰጥበት ጊዜ በንፁህ መረጃ ውስጥ ከሚቀርበው መረጃ ጋር ለመስራት በጣም ቀላል እና የበለጠ ምቹ ነው።

በቲዲር ጥቅል ውስጥ የተካተቱ ዋና ተግባራት

tidyr ሰንጠረዦችን ለመለወጥ የተነደፉ የተግባሮች ስብስብ ይዟል፡-

  • fill() - የጎደሉትን ዋጋዎች በአምድ ውስጥ ከቀደምት ዋጋዎች ጋር መሙላት;
  • separate() - መለያየትን በመጠቀም አንዱን መስክ ወደ ብዙ ይከፍላል;
  • unite() - በርካታ መስኮችን ወደ አንድ የማጣመር ተግባርን ያከናውናል ፣ የተግባር ተገላቢጦሽ separate();
  • pivot_longer() - መረጃን ከሰፊ ቅርጸት ወደ ረጅም ቅርጸት የሚቀይር ተግባር;
  • pivot_wider() - መረጃን ከረዥም ቅርጸት ወደ ሰፊ ቅርጸት የሚቀይር ተግባር። በተግባሩ የሚሠራው የተገላቢጦሽ አሠራር pivot_longer().
  • gather()ጊዜው ያለፈበት - መረጃን ከሰፊ ቅርጸት ወደ ረጅም ቅርጸት የሚቀይር ተግባር;
  • spread()ጊዜው ያለፈበት - መረጃን ከረዥም ቅርጸት ወደ ሰፊ ቅርጸት የሚቀይር ተግባር። በተግባሩ የሚሠራው የተገላቢጦሽ አሠራር gather().

መረጃን ከሰፊ ወደ ረጅም ቅርጸት ለመለወጥ አዲስ ጽንሰ-ሀሳብ እና በተቃራኒው

ከዚህ በፊት ተግባራት ለዚህ አይነት ለውጥ ጥቅም ላይ ውለው ነበር gather() и spread(). እነዚህ ተግባራት በነበሩባቸው ዓመታት ውስጥ የጥቅሉን ደራሲን ጨምሮ ለአብዛኛዎቹ ተጠቃሚዎች የእነዚህ ተግባራት ስሞች እና ክርክሮች በጣም ግልፅ እንዳልሆኑ እና እነሱን ለማግኘት እና ከእነዚህ ተግባራት ውስጥ የትኛውን እንደሚለውጥ ለመረዳት ችግር እንደፈጠረ ግልጽ ሆነ ። የቀን ክፈፍ ከሰፊ እስከ ረጅም ቅርጸት እና በተቃራኒው።

በዚህ ረገድ በ tidyr የቀን ፍሬሞችን ለመለወጥ የተነደፉ ሁለት አዲስ፣ ጠቃሚ ተግባራት ተጨምረዋል።

Овые функции pivot_longer() и pivot_wider() በጥቅሉ ውስጥ ባሉ አንዳንድ ባህሪያት ተመስጦ ነበር። cdataበጆን ተራራ እና በኒና ዙመል የተፈጠረ።

በጣም የአሁኑን የ tidyr 0.8.3.9000 ስሪት በመጫን ላይ

አዲሱን ፣ በጣም የአሁኑን የጥቅል ስሪት ለመጫን tidyr 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(), በዋናው ሠንጠረዥ ውስጥ አክሲዮኖች በክርክር ውስጥ የተዘረዘሩ ዓምዶች የሉም ስሞች_ለ и እሴቶች_ለ ስማቸው በጥቅስ ምልክቶች ውስጥ መሆን አለበት.

ከአዲስ ፅንሰ-ሀሳብ ጋር ወደ ሥራ እንዴት መቀየር እንደሚችሉ በቀላሉ የሚረዳዎ ሠንጠረዥ tidyr.

R ጥቅል tidyr እና አዲሶቹ ተግባራቶቹ pivot_long and pivot_wider

ማስታወሻ ከጸሐፊው

ከዚህ በታች ያለው ጽሑፍ ሁሉ የሚለምደዉ ነው፣ ነፃ ትርጉም እንኳን እላለሁ። ቪንቴቶች ከኦፊሴላዊው የቲዲቨርስ ቤተመፃህፍት ድህረ ገጽ።

መረጃን ከሰፊ ወደ ረጅም ቅርጸት የመቀየር ቀላል ምሳሌ

pivot_longer () - የአምዶችን ብዛት በመቀነስ እና የረድፎችን ብዛት በመጨመር የውሂብ ስብስቦችን ይረዝማል።

R ጥቅል tidyr እና አዲሶቹ ተግባራቶቹ pivot_long and 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()

  • የመጀመሪያ ክርክር ኮላሎች, የትኞቹ ዓምዶች መቀላቀል እንዳለባቸው ይገልጻል. በዚህ አጋጣሚ, በስተቀር ሁሉም አምዶች ጊዜ.
  • ክርክር ስሞች_ለ ከተጣመርንባቸው ዓምዶች ስም የሚፈጠረውን ተለዋዋጭ ስም ይሰጣል።
  • እሴቶች_ለ በተዋሃዱ አምዶች ሕዋሶች ውስጥ ከተከማቹ መረጃዎች የሚፈጠረውን ተለዋዋጭ ስም ይሰጣል።

አስማሚዎች

ይህ የጥቅል አዲስ ተግባር ነው። tidyr, ቀደም ሲል ከቆዩ ተግባራት ጋር ሲሰራ የማይገኝ ነበር.

ዝርዝር መግለጫ የውሂብ ፍሬም ነው፣ እያንዳንዱ ረድፍ በአዲሱ የውጤት ቀን ፍሬም ውስጥ ካለው አንድ አምድ ጋር ይዛመዳል፣ እና ሁለት ልዩ አምዶች የሚጀምሩት፡-

  • .name ዋናውን የአምድ ስም ይዟል።
  • .እሴት የሕዋስ እሴቶችን የሚያካትት የአምዱ ስም ይዟል።

የቀሩት የዝርዝሩ አምዶች አዲሱ አምድ የተጨመቁትን አምዶች ስም እንዴት እንደሚያሳይ ያንፀባርቃሉ .name.

መግለጫው በአምድ ስም የተከማቸውን ሜታዳታ ይገልፃል፣ ለእያንዳንዱ አምድ አንድ ረድፍ እና ለእያንዳንዱ ተለዋዋጭ አንድ አምድ፣ ከአምድ ስም ጋር ተደምሮ፣ ይህ ፍቺ በአሁኑ ጊዜ ግራ የሚያጋባ ሊመስል ይችላል፣ ነገር ግን ጥቂት ምሳሌዎችን ከተመለከትን በኋላ ብዙ ይሆናል። የበለጠ ግልጽ

የመግለጫው ነጥቡ እየተለወጠ ላለው የውሂብ ፍሬም አዲስ ሜታዳታን ማምጣት፣ ማሻሻል እና መግለጽ ይችላሉ።

ጠረጴዛን ከሰፊ ቅርጸት ወደ ረጅም ቅርጸት ሲቀይሩ ከዝርዝሮች ጋር ለመስራት, ተግባሩን ይጠቀሙ pivot_longer_spec().

ይህ ተግባር እንዴት እንደሚሰራ ማንኛውንም የቀን ፍሬም ወስዶ ዲበ ዳታውን ከላይ በተገለጸው መንገድ ማመንጨት ነው።

እንደ ምሳሌ ከጥቅሉ ጋር የቀረበውን የማን ዳታ ስብስብ እንውሰድ tidyr. ይህ የመረጃ ቋት በአለም አቀፍ የጤና ድርጅት የሳንባ ነቀርሳ በሽታ መከሰትን የሚመለከት መረጃ ይዟል።

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

መስኮች አገር, iso2, iso3 ቀድሞውኑ ተለዋዋጮች ናቸው። የእኛ ተግባር ዓምዶቹን መገልበጥ ነው። አዲስ_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

እባክዎ ዓምዱን ያስተውሉ .name ይህ የእኛ መረጃ ጠቋሚ ወደ የመጀመሪያው የውሂብ ስብስብ የአምድ ስሞች ስለሆነ ሳይለወጥ መቆየት አለበት።

ጾታ እና ዕድሜ (አምዶች ፆታ и ዕድሜ) ቋሚ እና የታወቁ እሴቶች አሏቸው፣ ስለዚህ እነዚህን አምዶች ወደ ምክንያቶች ለመቀየር ይመከራል፡-

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_long and pivot_wider

በርካታ እሴቶችን (. እሴት) በመጠቀም መግለጫ

ከላይ ባለው ምሳሌ, የዝርዝሩ አምድ .እሴት አንድ እሴት ብቻ ይዟል፣ በአብዛኛዎቹ ጉዳዮች ይህ ነው።

ነገር ግን አልፎ አልፎ በእሴቶች ውስጥ የተለያዩ የውሂብ ዓይነቶች ካላቸው ዓምዶች ውሂብ መሰብሰብ ሲያስፈልግ አንድ ሁኔታ ሊፈጠር ይችላል። የቆየ ተግባር በመጠቀም spread() ይህን ለማድረግ በጣም አስቸጋሪ ይሆናል.

ከዚህ በታች ያለው ምሳሌ የተወሰደው ከ ቪንቴቶች ወደ ጥቅል ዳታ.

የሥልጠና ዳታ ፍሬም እንፍጠር።

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")) - ዓምዱን ይከፋፍሉት .name, ይህም የመነሻ መስኮችን ስም የያዘ, የስር ምልክትን በመጠቀም እና የተገኙትን እሴቶች ወደ አምዶች ውስጥ በማስገባት. .እሴት и ልጅ.
  • 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_long and 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()ውስጥ የተገለጹት አምዶች .nameእሴቶችን በመጠቀም .እሴት እና ሌሎች አምዶች.

ለእዚህ የውሂብ ስብስብ፣ በመረጃው ውስጥ የሚገኙትን ብቻ ሳይሆን እያንዳንዱ ሀገር እና የምርት ጥምረት የራሱ አምድ እንዲኖረው ከፈለጉ ብጁ ዝርዝር ማመንጨት ይችላሉ።

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

አሁን ለእያንዳንዱ እውቂያ ልዩ መታወቂያ ስላለን መስኩን እና እሴቱን ወደ አምዶች መለወጥ እንችላለን፡-

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>

መደምደሚያ

የእኔ የግል አስተያየት አዲሱ ጽንሰ-ሐሳብ ነው tidyr በእውነቱ የበለጠ ሊታወቅ የሚችል እና በተግባራዊነት ከውርስ ተግባራት የላቀ spread() и gather(). ይህ ጽሑፍ እርስዎን ለመቋቋም እንደረዳዎት ተስፋ አደርጋለሁ pivot_longer() и pivot_wider().

ምንጭ: hab.com

አስተያየት ያክሉ