R package tidyr ug ang bag-ong mga function niini pivot_longer ug pivot_wider

Pakete tiglimpyo gilakip sa kinauyokan sa usa sa labing inila nga mga librarya sa R ​​nga pinulongan - tidyverse.
Ang panguna nga katuyoan sa pakete mao ang pagdala sa datos sa usa ka tukma nga porma.

Anaa na sa Habré publikasyon gipahinungod sa kini nga pakete, apan kini nagsugod kaniadtong 2015. Ug gusto nako isulti kanimo ang bahin sa labing bag-ong mga pagbag-o, nga gipahibalo pipila ka adlaw ang milabay sa tagsulat niini, si Hedley Wickham.

R package tidyr ug ang bag-ong mga function niini pivot_longer ug pivot_wider

SJK: Ang gather() ug spread() ba dili na gamiton?

Hadley Wickham: Sa pipila ka sukod. Dili na namo irekomendar ang paggamit niini nga mga function ug ayohon ang mga bug sa kanila, apan sila magpadayon nga anaa sa package sa ilang kasamtangan nga kahimtang.

Mga sulod

Kung interesado ka sa pagtuki sa datos, mahimong interesado ka sa akong telegram и youtube mga kanal. Kadaghanan sa sulod gipahinungod sa R ​​nga pinulongan.

TidyData nga konsepto

Tumong tiglimpyo — tabangi ka nga madala ang datos sa usa ka gitawag nga hapsay nga porma. Ang hapsay nga datos mao ang datos diin:

  • Ang matag variable anaa sa usa ka kolum.
  • Ang matag obserbasyon usa ka hilo.
  • Ang matag kantidad usa ka cell.

Mas sayon ​​ug mas sayon ​​​​ang pagtrabaho sa mga datos nga gipresentar sa hapsay nga datos sa dihang nagpahigayon sa pagtuki.

Ang mga nag-unang gimbuhaton nga gilakip sa tidyr package

Ang tidyr adunay usa ka hugpong sa mga gimbuhaton nga gidisenyo aron mabag-o ang mga lamesa:

  • fill() - pagpuno sa nawala nga mga kantidad sa usa ka kolum nga adunay nauna nga mga kantidad;
  • separate() — nagbahin sa usa ka field ngadto sa pipila gamit ang separator;
  • unite() — nagpahigayon sa operasyon sa paghiusa sa pipila ka mga natad ngadto sa usa, ang inverse aksyon sa function separate();
  • pivot_longer() — usa ka function nga nagbag-o sa datos gikan sa halapad nga format hangtod sa taas nga format;
  • pivot_wider() - usa ka function nga nagbag-o sa datos gikan sa taas nga format hangtod sa lapad nga format. Ang reverse nga operasyon sa usa nga gihimo sa function pivot_longer().
  • gather()karaan na — usa ka function nga nagbag-o sa datos gikan sa halapad nga format hangtod sa taas nga format;
  • spread()karaan na - usa ka function nga nagbag-o sa datos gikan sa taas nga format hangtod sa lapad nga format. Ang reverse nga operasyon sa usa nga gihimo sa function gather().

Bag-ong konsepto alang sa pag-convert sa datos gikan sa lapad ngadto sa taas nga format ug vice versa

Kaniadto, ang mga gimbuhaton gigamit alang sa kini nga matang sa pagbag-o gather() и spread(). Sulod sa mga katuigan sa paglungtad niini nga mga gimbuhaton, kini nahimong dayag nga alang sa kadaghanan sa mga tiggamit, lakip na ang tagsulat sa package, ang mga ngalan niini nga mga gimbuhaton ug ang ilang mga argumento dili kaayo klaro, ug hinungdan sa mga kalisud sa pagpangita kanila ug sa pagsabut kon hain niini nga mga gimbuhaton nakabig. usa ka frame sa petsa gikan sa lapad ngadto sa taas nga pormat, ug vice versa.

Niining bahina, sa tiglimpyo Duha ka bag-o, hinungdanon nga mga gimbuhaton ang gidugang nga gidisenyo aron mabag-o ang mga frame sa petsa.

Bag-ong mga bahin pivot_longer() и pivot_wider() nadasig sa pipila ka bahin sa package cdata, gimugna ni John Mount ug Nina Zumel.

Pag-instalar sa pinakabag-o nga bersyon sa tidyr 0.8.3.9000

Aron ma-install ang bag-o, pinakabag-o nga bersyon sa package tiglimpyo 0.8.3.9000, diin anaa ang bag-ong mga feature, gamita ang mosunod nga code.

devtools::install_github("tidyverse/tidyr")

Sa panahon sa pagsulat, kini nga mga gimbuhaton magamit ra sa bersyon sa dev sa package sa GitHub.

Pagbalhin ngadto sa bag-ong mga bahin

Sa tinuud, dili lisud ang pagbalhin sa daan nga mga script aron magtrabaho uban ang bag-ong mga gimbuhaton; alang sa mas maayo nga pagsabut, magkuha ako usa ka pananglitan gikan sa dokumentasyon sa mga daan nga gimbuhaton ug ipakita kung giunsa ang parehas nga mga operasyon gihimo gamit ang mga bag-o. pivot_*() mga gimbuhaton.

I-convert ang lapad nga format ngadto sa taas nga format.

Ehemplo nga code gikan sa gather function documentation

# 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")

Pag-convert sa taas nga format ngadto sa lapad nga format.

Pananglitan nga code gikan sa spread function documentation

# old
stocks_spread <- stocks_gather %>% spread(key = stock, 
                                          value = price) 

# new 
stock_wide    <- stocks_long %>% pivot_wider(names_from  = "stock",
                                            values_from = "price")

Kay sa ibabaw nga mga pananglitan sa pagtrabaho uban sa pivot_longer() и pivot_wider(), sa orihinal nga lamesa Stocks walay mga kolum nga gilista sa mga argumento mga ngalan_sa и values_to ang ilang mga ngalan kinahanglang anaa sa mga marka sa kinutlo.

Usa ka lamesa nga makatabang kanimo nga dali nga mahibal-an kung giunsa ang pagbalhin sa pagtrabaho sa usa ka bag-ong konsepto tiglimpyo.

R package tidyr ug ang bag-ong mga function niini pivot_longer ug pivot_wider

Pahinumdom gikan sa tagsulat

Ang tanan nga teksto sa ubos kay adaptive, bisan ako moingon nga libre nga paghubad mga vignette gikan sa opisyal nga tidyverse library website.

Usa ka yano nga pananglitan sa pag-convert sa datos gikan sa lapad ngadto sa taas nga format

pivot_longer () - naghimo sa mga set sa datos nga mas taas pinaagi sa pagkunhod sa gidaghanon sa mga kolum ug pagdugang sa gidaghanon sa mga laray.

R package tidyr ug ang bag-ong mga function niini pivot_longer ug pivot_wider

Aron mapadagan ang mga pananglitan nga gipresentar sa artikulo, kinahanglan nimo una nga ikonektar ang kinahanglan nga mga pakete:

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

Ingnon ta nga kita adunay usa ka lamesa nga adunay mga resulta sa usa ka survey nga (lakip sa ubang mga butang) nangutana sa mga tawo bahin sa ilang relihiyon ug tinuig nga kita:

#> # 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>

Kini nga lamesa naglangkob sa data sa relihiyon sa mga respondents sa mga laray, ug ang lebel sa kita nagkatag sa mga ngalan sa kolum. Ang gidaghanon sa mga respondents gikan sa matag kategorya gitipigan sa mga kantidad sa cell sa intersection sa relihiyon ug lebel sa kita. Aron madala ang lamesa sa usa ka hapsay, husto nga pormat, igo na nga gamiton 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

Function nga mga argumento pivot_longer()

  • Unang argumento kwelyo, naghulagway kung unsang mga kolum ang kinahanglan i-merge. Sa kini nga kaso, ang tanan nga mga kolum gawas panahon.
  • argumento mga ngalan_sa naghatag sa ngalan sa variable nga pagabuhaton gikan sa mga ngalan sa mga kolum nga among gihugpong.
  • values_to naghatag sa ngalan sa usa ka variable nga pagabuhaton gikan sa mga datos nga gitipigan sa mga kantidad sa mga selula sa gihiusa nga mga kolum.

Спецификации

Kini usa ka bag-ong gamit sa package tiglimpyo, nga kaniadto dili magamit kung nagtrabaho kauban ang mga kabilin nga gimbuhaton.

Ang espesipikasyon kay usa ka data frame, ang matag laray niini katumbas sa usa ka column sa bag-ong output date frame, ug duha ka espesyal nga column nga nagsugod sa:

  • .name naglangkob sa orihinal nga ngalan sa kolum.
  • .bili naglangkob sa ngalan sa kolum nga maglangkob sa mga kantidad sa cell.

Ang nahabilin nga mga kolum sa espesipikasyon nagpakita kung giunsa ipakita sa bag-ong kolum ang ngalan sa mga compressed column gikan sa .name.

Gihulagway sa espesipiko ang metadata nga gitipigan sa usa ka ngalan sa kolum, nga adunay usa ka laray sa matag kolum ug usa ka kolum alang sa matag variable, inubanan sa ngalan sa kolum, kini nga kahulugan mahimo’g makalibog sa pagkakaron, apan pagkahuman sa pagtan-aw sa pipila ka mga pananglitan kini mahimong labi ka daghan. mas klaro.

Ang punto sa espesipikasyon mao nga mahimo nimong makuha, usbon, ug ipasabut ang bag-ong metadata alang sa dataframe nga nakabig.

Aron magtrabaho uban ang mga detalye kung mag-convert sa usa ka lamesa gikan sa usa ka halapad nga format ngadto sa taas nga format, gamita ang function pivot_longer_spec().

Sa unsa nga paagi kini nga function naglihok mao nga kini nagkinahanglan sa bisan unsa nga petsa frame ug makamugna sa iyang metadata sa paagi nga gihulagway sa ibabaw.

Isip usa ka pananglitan, atong kuhaon ang kung kinsa ang dataset nga gihatag sa package tiglimpyo. Kini nga dataset adunay impormasyon nga gihatag sa internasyonal nga organisasyon sa panglawas bahin sa insidente sa tuberculosis.

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

Atong tukuron ang espesipikasyon niini.

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

kaumahan nasud, isoxnumx, isoxnumx mga variables na. Ang among tahas mao ang pag-flip sa mga kolum gamit ang bag-o_sp_m014 sa newrel_f65.

Ang mga ngalan niini nga mga kolum nagtipig sa mosunod nga impormasyon:

  • Prefix new_ nagpakita nga ang kolum naglangkob sa data sa bag-ong mga kaso sa tuberculosis, ang kasamtangan nga petsa frame naglangkob sa impormasyon lamang sa bag-ong mga sakit, mao nga kini nga prefix sa kasamtangan nga konteksto wala magdala sa bisan unsa nga kahulogan.
  • sp/rel/sp/ep naghulagway sa usa ka paagi sa pagdayagnos sa usa ka sakit.
  • m/f gender sa pasyente.
  • 014/1524/2535/3544/4554/65 edad sa pasyente.

Mahimo natong bahinon kini nga mga kolum gamit ang function extract()gamit ang regular nga ekspresyon.

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

Palihug timan-i ang kolum .name kinahanglan magpabilin nga wala mausab tungod kay kini ang among indeks sa mga ngalan sa kolum sa orihinal nga dataset.

Kasarian ug edad (kolum gender и edad) adunay mga piho ug nahibal-an nga mga kantidad, busa girekomenda nga i-convert kini nga mga kolum sa mga hinungdan:

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

Sa katapusan, aron magamit ang detalye nga among gihimo sa orihinal nga frame sa petsa nga kinahanglan natong gamiton ang argumento detalye sa function 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

Ang tanan nga bag-o lang naton nahimo mahimo nga gihulagway nga eskematiko sama sa mosunod:

R package tidyr ug ang bag-ong mga function niini pivot_longer ug pivot_wider

Pagtino gamit ang daghang mga kantidad (.value)

Sa pananglitan sa ibabaw, ang kolum sa espesipikasyon .bili adunay usa lamang ka bili, sa kadaghanang kaso mao kini ang kahimtang.

Apan usahay ang usa ka sitwasyon mahimong motumaw kung kinahanglan nimo nga mangolekta og datos gikan sa mga kolum nga adunay lainlaing mga tipo sa datos sa mga kantidad. Paggamit sa usa ka legacy function spread() lisud kini buhaton.

Ang pananglitan sa ubos gikuha gikan sa mga vignette ngadto sa pakete datos.tabla.

Magbuhat ta ug training dataframe.

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

Ang gibuhat nga frame sa petsa adunay mga datos sa mga anak sa usa ka pamilya sa matag linya. Ang mga pamilya mahimong adunay usa o duha ka anak. Alang sa matag bata, ang datos gihatag sa petsa sa pagkahimugso ug gender, ug ang datos alang sa matag bata naa sa lainlain nga mga kolum; ang among tahas mao ang pagdala niini nga datos sa husto nga pormat alang sa pagtuki.

Palihug timan-i nga kami adunay duha ka mga variable nga adunay kasayuran bahin sa matag bata: ang ilang gender ug petsa sa pagkatawo (mga kolum nga adunay prefix pagkahuman adunay petsa sa pagkatawo, mga kolum nga adunay prefix gender naglangkob sa sekso sa bata). Ang gipaabot nga resulta mao nga sila kinahanglan nga makita sa lain nga mga kolum. Mahimo nato kini pinaagi sa paghimo og usa ka detalye diin ang kolum .value adunay duha ka lain-laing mga kahulogan.

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

Busa, atong tan-awon ang sunod-sunod nga mga aksyon nga gihimo sa code sa ibabaw.

  • pivot_longer_spec(-family) - paghimo og usa ka espesipikasyon nga nag-compress sa tanan nga anaa nga mga kolum gawas sa kolum sa pamilya.
  • separate(col = name, into = c(".value", "child")) - bahina ang kolum .name, nga naglangkob sa mga ngalan sa gigikanan nga mga natad, gamit ang underscore ug pagsulod sa mga sangputanan nga kantidad sa mga kolum. .bili и bata.
  • mutate(child = parse_number(child)) - pagbag-o sa mga kantidad sa uma bata gikan sa teksto ngadto sa numeric data type.

Karon mahimo na namon nga magamit ang sangputanan nga detalye sa orihinal nga dataframe ug dad-on ang lamesa sa gusto nga porma.

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

Gigamit namon ang argumento na.rm = TRUE, tungod kay ang kasamtangan nga porma sa datos nagpugos sa paghimo sa dugang nga mga laray alang sa wala'y mga obserbasyon. Kay ang pamilya 2 adunay usa ra ka anak, na.rm = TRUE naggarantiya nga ang pamilya 2 adunay usa ka laray sa output.

Pag-convert sa mga frame sa petsa gikan sa taas ngadto sa lapad nga format

pivot_wider() - mao ang inverse nga pagbag-o, ug vice versa nagdugang sa gidaghanon sa mga kolum sa frame sa petsa pinaagi sa pagkunhod sa gidaghanon sa mga laray.

R package tidyr ug ang bag-ong mga function niini pivot_longer ug pivot_wider

Kini nga matang sa pagbag-o panagsa ra nga gigamit aron madala ang datos sa usa ka hapsay nga porma, bisan pa, kini nga teknik mahimong mapuslanon alang sa paghimo sa mga pivot table nga gigamit sa mga presentasyon, o alang sa paghiusa sa uban pang mga himan.

Sa tinuud ang mga gimbuhaton pivot_longer() и pivot_wider() mga simetriko, ug nagpatunghag mga aksyon nga balit-ad sa usag usa, i.e.: df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec) и df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec) ibalik ang orihinal nga df.

Ang pinakasimple nga pananglitan sa pag-convert sa usa ka lamesa ngadto sa lapad nga format

Aron ipakita kung giunsa ang paglihok pivot_wider() atong gamiton ang dataset fish_encounters, nga nagtipig og impormasyon kon giunsa pagrekord sa lainlaing mga estasyon ang paglihok sa mga isda ubay sa suba.

#> # 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

Sa kadaghanan nga mga kaso, kini nga lamesa mahimong labi ka impormatibo ug dali gamiton kung imong ipakita ang kasayuran alang sa matag estasyon sa usa ka lahi nga kolum.

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>

Kini nga data set nagrekord lamang sa impormasyon kung ang mga isda nakit-an sa estasyon, i.e. kung adunay mga isda nga wala natala sa usa ka estasyon, nan kini nga datos wala sa lamesa. Kini nagpasabot nga ang output mapuno sa NA.

Bisan pa, sa kini nga kaso nahibal-an namon nga ang pagkawala sa usa ka rekord nagpasabut nga ang isda wala makita, mao nga magamit namon ang argumento values_fill sa function pivot_wider() ug pun-a kining nawala nga mga kantidad sa mga sero:

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>

Pagmugna og ngalan sa kolum gikan sa daghang mga baryable sa tinubdan

Hunahunaa nga kita adunay usa ka lamesa nga adunay usa ka kombinasyon sa produkto, nasud ug tuig. Aron makamugna og test date frame, mahimo nimong ipadagan ang mosunod nga code:

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

Ang among tahas mao ang pagpalapad sa data frame aron ang usa ka kolum adunay mga datos alang sa matag kombinasyon sa produkto ug nasud. Aron mahimo kini, ipasa lang ang argumento mga ngalan_gikan sa usa ka vector nga adunay mga ngalan sa mga field nga i-merge.

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

Mahimo usab nimo i-apply ang mga detalye sa usa ka function pivot_wider(). Apan sa dihang gisumite sa pivot_wider() ang detalye naghimo sa kaatbang nga pagkakabig pivot_longer(): Ang mga kolum nga gipiho sa .name, gamit ang mga kantidad gikan sa .bili ug uban pang mga kolum.

Alang sa kini nga dataset, mahimo kang makamugna og custom specification kung gusto nimo nga ang matag posible nga nasud ug kombinasyon sa produkto adunay kaugalingong column, dili lang ang anaa sa data:

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

Daghang mga advanced nga pananglitan sa pagtrabaho kauban ang bag-ong konsepto sa tidyr

Paglimpyo sa datos gamit ang US Census Income and Rent dataset isip pananglitan.

Set sa datos us_rent_income naglangkob sa median nga kinitaan ug impormasyon sa abang alang sa matag estado sa US alang sa 2017 (data set anaa sa package tidycensus).

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

Sa porma diin ang datos gitipigan sa dataset us_rent_income Ang pagtrabaho uban kanila hilabihan ka dili kombenyente, mao nga gusto namong maghimo ug data set nga adunay mga kolum: abang, rent_moe, moabut, kita_moe. Adunay daghang mga paagi sa paghimo niini nga detalye, apan ang panguna nga punto mao nga kinahanglan naton nga makamugna ang matag kombinasyon sa mga variable nga kantidad ug banabana/moeug dayon paghimo sa ngalan sa kolum.

  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

Paghatag niini nga espesipikasyon pivot_wider() naghatag kanamo sa resulta nga among gipangita:

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

Ang World Bank

Usahay ang pagdala sa usa ka set sa datos sa gusto nga porma nanginahanglan daghang mga lakang.
Dataset world_bank_pop naglangkob sa datos sa World Bank sa populasyon sa matag nasud tali sa 2000 ug 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>

Ang among katuyoan mao ang paghimo usa ka hapsay nga set sa datos sa matag variable sa kaugalingon nga kolum. Dili klaro kung unsang mga lakang ang kinahanglan, apan magsugod kami sa labing klaro nga problema: ang tuig mikaylap sa daghang mga kolum.

Aron ayohon kini kinahanglan nimo nga gamiton ang function 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

Ang sunod nga lakang mao ang pagtan-aw sa variable indicator.
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

Diin ang SP.POP.GROW mao ang pagtubo sa populasyon, ang SP.POP.TOTL mao ang kinatibuk-ang populasyon, ug ang SP.URB. * parehas nga butang, apan alang lamang sa mga urban nga lugar. Atong bahinon kini nga mga kantidad sa duha ka mga variable: area - area (total o urban) ug usa ka variable nga adunay aktwal nga datos (populasyon o pagtubo):

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

Karon ang kinahanglan namong buhaton mao ang pagbahin sa variable sa duha ka mga kolum:

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

Listahan sa mga kontak

Usa ka katapusang pananglitan, hunahunaa nga ikaw adunay usa ka lista sa kontak nga imong gikopya ug gi-paste gikan sa usa ka website:

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

Ang pag-tabula niini nga lista lisud kaayo tungod kay wala’y variable nga nagpaila kung unsang datos ang nahisakop sa kung unsang kontak. Mahimo naton kini nga ayohon pinaagi sa pagtimaan nga ang datos alang sa matag bag-ong kontak nagsugod sa usa ka ngalan ("ngalan"), aron makahimo kami usa ka talagsaon nga identifier ug madugangan kini usa sa matag higayon nga ang kantidad nga "ngalan" makit-an sa kolum sa uma:

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

Karon nga kami adunay usa ka talagsaon nga ID alang sa matag kontak, mahimo namon nga himuon nga mga kolum ang uma ug kantidad:

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>

konklusyon

Ang akong personal nga opinyon mao nga ang bag-ong konsepto tiglimpyo tinuod nga mas intuitive, ug kamahinungdanon superyor sa functionality sa kabilin function spread() и gather(). Nanghinaut ko nga kini nga artikulo nakatabang kanimo sa pag-atubang niini pivot_longer() и pivot_wider().

Source: www.habr.com

Idugang sa usa ka comment