R package tidyr sy ny asany vaovao pivot_longer sy pivot_wider

fonosana tidyr tafiditra ao anatin'ny fototry ny iray amin'ireo tranomboky malaza indrindra amin'ny fiteny R - tidyverse.
Ny tanjon'ny fonosana dia ny hitondra ny angon-drakitra amin'ny endrika marina.

Efa misy amin'ny Habré boky natokana ho an'ity fonosana ity, saingy nanomboka tamin'ny taona 2015 izany. Ary te-hilaza aminareo momba ny fiovana farany indrindra aho, izay nambaran'ny mpanoratra azy, Hedley Wickham, andro vitsy lasa izay.

R package tidyr sy ny asany vaovao pivot_longer sy pivot_wider

S.J.K.: Ho foana ve ny fanangonana() sy hiparitaka() ?

Hadley Wickham: Amin'ny lafiny sasany. Tsy hanoro ny fampiasana ireo fiasa ireo intsony izahay ary hanitsy ny bibikely ao aminy, fa mbola ho eo amin'ny fonosana amin'ny toe-javatra misy azy ireo.

afa-po

Raha liana amin'ny fanadihadiana angon-drakitra ianao dia mety ho liana amin'ny ahy telegrama и YouTube fantsona. Ny ankamaroan'ny votoaty dia natokana ho an'ny fiteny R.

TidyData concept

tanjona tidyr - manampy anao hitondra ny angon-drakitra amin'ny endrika antsoina hoe milamina. Ny angona madio dia angon-drakitra misy:

  • Ao amin'ny tsanganana ny fari-piainana tsirairay.
  • Ny fandinihana tsirairay dia tady.
  • Ny sanda tsirairay dia sela.

Mora kokoa sy mora kokoa ny miasa miaraka amin'ny angona izay aseho amin'ny angon-drakitra milamina rehefa manao famakafakana.

Ny asa lehibe tafiditra ao amin'ny fonosana tidyr

Ny tidyr dia misy andiana fiasa natao hanovana tabilao:

  • fill() - famenoana sanda tsy hita ao anaty tsanganana misy sanda teo aloha;
  • separate() - manasaraka saha iray ho maromaro amin'ny alalan'ny fanasarahana;
  • unite() — manatanteraka ny fiasan'ny fampifangaroana saha maromaro ho iray, ny fihetsika mifanohitra amin'ny asa separate();
  • pivot_longer() - asa iray mamadika ny angona avy amin'ny endrika malalaka ho endrika lava;
  • pivot_wider() - fiasa mamadika angona avy amin'ny endrika lava ho endrika malalaka. Ny fampandehanana mivadika amin'ny asa atao pivot_longer().
  • gather()lany andro - asa iray mamadika ny angona avy amin'ny endrika malalaka ho endrika lava;
  • spread()lany andro - fiasa mamadika angona avy amin'ny endrika lava ho endrika malalaka. Ny fampandehanana mivadika amin'ny asa atao gather().

Hevitra vaovao amin'ny famadihana angona avy amin'ny endrika malalaka mankany amin'ny lava sy ny mifamadika amin'izany

Teo aloha dia nampiasaina tamin'ny karazana fanovana toy izany ny fiasa gather() и spread(). Nandritra ny taona maro nisian'ireo fiasa ireo dia nanjary niharihary fa ho an'ny ankamaroan'ny mpampiasa, anisan'izany ny mpanoratra ny fonosana, ny anaran'ireo fiasa ireo sy ny tohan-kevitr'izy ireo dia tsy dia mazava loatra, ary niteraka fahasahiranana tamin'ny fitadiavana azy ireo sy ny fahatakarana hoe iza amin'ireo fiasa ireo no miova fo. lamin'ny daty manomboka amin'ny endrika malalaka ka hatramin'ny lava, ary ny mifamadika amin'izany.

Amin'io lafiny io, in tidyr Nisy fiasa vaovao roa manan-danja nampiana izay natao hanovana ny lamin'ny daty.

Endri-javatra vaovao pivot_longer() и pivot_wider() nentanin'ny sasany amin'ireo endri-javatra ao anaty fonosana cdata, noforonin'i John Mount sy Nina Zumel.

Fametrahana ny kinova farany amin'ny tidyr 0.8.3.9000

Hametraka ny kinova vaovao farany amin'ny fonosana tidyr 0.8.3.9000, izay misy endri-javatra vaovao, ampiasao ity kaody manaraka ity.

devtools::install_github("tidyverse/tidyr")

Amin'ny fotoana anoratana, ireo fiasa ireo dia tsy misy afa-tsy amin'ny dikan-devo amin'ny fonosana ao amin'ny GitHub.

Tetezana amin'ny endri-javatra vaovao

Raha ny marina, tsy sarotra ny mamindra script taloha mba hiasa amin'ny fiasa vaovao; Mba hahazoana tsara kokoa dia haka ohatra avy amin'ny antontan-taratasy momba ny fiasa taloha aho ary hampiseho ny fomba fiasa mitovy amin'ny fampiasana vaovao. pivot_*() asa.

Hanova endrika malalaka ho endrika lava.

Kaody ohatra avy amin'ny tahirin-kevitra fanangonana

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

Manova endrika lava ho endrika malalaka.

Kaody ohatra avy amin'ny tahirin-kevitra miparitaka

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

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

SATRIA amin'ireo ohatra etsy ambony momba ny fiaraha-miasa pivot_longer() и pivot_wider(), ao amin'ny tabilao voalohany boloky hazo tsy misy tsanganana voatanisa ao amin'ny tohan-kevitra anarana_to и values_to ny anaran'izy ireo dia tsy maintsy misy marika.

Tabilao izay hanampy anao hamantatra mora kokoa ny fomba hifindra hiasa amin'ny foto-kevitra vaovao tidyr.

R package tidyr sy ny asany vaovao pivot_longer sy pivot_wider

Fanamarihana avy amin'ny mpanoratra

Ny lahatsoratra rehetra eto ambany dia adaptive, hoy aho hoe fandikana maimaim-poana vignettes avy amin'ny tranokala ofisialy tidyverse.

Ohatra tsotra amin'ny famadihana angona avy amin'ny endrika malalaka mankany amin'ny lava

pivot_longer () - mahatonga ny angon-drakitra ho lava kokoa amin'ny fampihenana ny isan'ny tsanganana sy ny fampitomboana ny isan'ny andalana.

R package tidyr sy ny asany vaovao pivot_longer sy pivot_wider

Mba hampandehanana ireo ohatra aseho ao amin'ny lahatsoratra dia mila mampifandray ireo fonosana ilaina aloha ianao:

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

Andeha atao hoe manana latabatra misy valin'ny fanadihadiana iray izay (ankoatra ny zavatra hafa) nanontanian'ny olona momba ny fivavahany sy ny fidiram-bolany isan-taona:

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

Ity tabilao ity dia misy angon-drakitra momba ny fivavahan'ireo mpamaly andalana ary miparitaka manerana ny anaran'ny tsanganana ny tahan'ny fidiram-bola. Ny isan'ny mpamaly avy amin'ny sokajy tsirairay dia voatahiry ao amin'ny sandan'ny sela eo amin'ny fihaonan'ny fivavahana sy ny haavon'ny fidiram-bola. Mba hahatonga ny latabatra ho madio sy marina endrika, dia ampy ny mampiasa 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 Arguments pivot_longer()

  • Fandresen-dahatra voalohany collars, mamaritra izay tsanganana tokony hatambatra. Amin'ity tranga ity, ny tsanganana rehetra afa-tsy fotoana.
  • fandresen-dahatra anarana_to manome ny anaran'ny faribolana izay hoforonina avy amin'ny anaran'ireo tsanganana natambatray.
  • values_to manome ny anaran'ny fari-piainana izay noforonina avy amin'ny angona voatahiry ao amin'ny sandan'ny sela ny tsanganana natambatra.

Specifications

Fampiasa vaovao amin'ny fonosana izany tidyr, izay tsy hita teo aloha raha niasa tamin'ny asa lova.

Ny famaritana dia rafitra angon-drakitra, ny andalana tsirairay dia mifanandrify amin'ny tsanganana iray ao amin'ny rafitra daty famoahana vaovao, ary tsanganana roa manokana izay manomboka amin'ny:

  • .Anarana misy ny anaran'ny tsanganana tany am-boalohany.
  • .value misy ny anaran'ny tsanganana izay ahitana ny sandan'ny sela.

Ny tsanganana sisa amin'ny famaritana dia maneho ny fomba hanehoan'ny tsanganana vaovao ny anaran'ireo tsanganana voatsindry .Anarana.

Ny famaritana dia mamaritra ny metadata voatahiry amin'ny anaran'ny tsanganana, miaraka amin'ny andalana iray ho an'ny tsanganana tsirairay ary tsanganana iray ho an'ny fari-piainana tsirairay, miaraka amin'ny anaran'ny tsanganana, ity famaritana ity dia mety ho sahiran-tsaina amin'izao fotoana izao, fa rehefa avy mijery ohatra vitsivitsy dia ho lasa be dia be. mazava kokoa.

Ny tanjon'ny famaritana dia ny ahafahanao maka, manova ary mamaritra ny metadata vaovao ho an'ny angon-drakitra niova fo.

Mba hiasa miaraka amin'ny fepetra manokana rehefa mamadika latabatra avy amin'ny endrika malalaka ho amin'ny endrika lava, ampiasao ny fiasa pivot_longer_spec().

Ny fomba fiasan'ity asa ity dia ny maka daty rehetra ary mamoaka ny metadatany amin'ny fomba voalaza etsy ambony.

Ohatra, andeha horaisintsika ny angon-drakitra izay omena miaraka amin'ny fonosana tidyr. Ity tahirin-kevitra ity dia ahitana fampahalalana nomen'ny fikambanana iraisam-pirenena momba ny fahasalamana momba ny trangan'ny raboka.

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

Andao hamboarina ny famaritana azy.

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

Fields firenena, isoxnumx, isoxnumx dia efa miovaova. Ny andraikitray dia ny mamadika ny tsanganana amin'ny new_sp_m014 amin'ny newrel_f65.

Ny anaran'ireo tsanganana ireo dia mitahiry ireto fampahalalana manaraka ireto:

  • tovona new_ dia manondro fa ny tsanganana dia misy angona momba ny tranga vaovao momba ny tioberkilaozy, ny daty amin'izao fotoana izao dia misy fampahalalana momba ny aretina vaovao ihany, noho izany dia tsy misy dikany io prefix io ​​amin'ny toe-javatra ankehitriny.
  • sp/rel/sp/ep mamaritra ny fomba hamantarana aretina.
  • m/f lahy sy vavy.
  • 014/1524/2535/3544/4554/65 isan-taona ny marary.

Azontsika zaraina ireo tsanganana ireo amin'ny fampiasana ny fiasa extract()mampiasa fomba fiteny mahazatra.

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

Mariho azafady ny tsanganana .Anarana dia tokony hijanona tsy hiova satria io no fanondroanay ao amin'ny anaran'ny tsanganana amin'ny angon-drakitra tany am-boalohany.

Ny lahy sy ny vavy (columns lahy sy ny vavy и taona) manana soatoavina raikitra sy fantatra, noho izany dia asaina mamadika ireto tsanganana ireto ho anton-javatra:

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

Farany, mba hampiharana ny famaritana noforoninay amin'ny lamin'ny daty tany am-boalohany izay mila mampiasa argument isika spec in 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

Ny zavatra rehetra nataontsika dia azo aseho amin'ny endrika toy izao manaraka izao:

R package tidyr sy ny asany vaovao pivot_longer sy pivot_wider

Famaritana mampiasa sanda maromaro (.value)

Ao amin'ny ohatra etsy ambony, ny tsanganana manokana .value tsy misy afa-tsy sanda iray, amin'ny ankamaroan'ny toe-javatra dia izany no izy.

Saingy indraindray misy toe-javatra mety hitranga rehefa mila manangona angona avy amin'ny tsanganana misy karazana angona samihafa amin'ny soatoavina ianao. Mampiasa asa lova spread() tena sarotra ny manao izany.

Ny ohatra etsy ambany dia nalaina avy amin'ny vignettes mankany amin'ny fonosana data.table.

Andao hamorona angon-drakitra fanofanana.

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

Ny rafitra daty noforonina dia misy angona momba ny zanaky ny fianakaviana iray isaky ny andalana. Mety manan-janaka iray na roa ny fianakaviana. Ho an'ny ankizy tsirairay dia omena ny daty nahaterahana sy ny lahy sy ny vavy, ary ny angon-drakitra ho an'ny ankizy tsirairay dia ao amin'ny tsanganana samihafa; ny andraikitray dia ny mitondra ireo angona ireo amin'ny endrika marina hanaovana fanadihadiana.

Mariho fa manana fari-pahaizana roa misy fampahalalana momba ny ankizy tsirairay isika: ny lahy sy ny vavy sy ny daty nahaterahany (tsanganana misy tovana dop misy daty nahaterahana, tsanganana misy tovana lahy sy ny vavy ahitana ny firaisana ara-nofo ny zaza). Ny vokatra andrasana dia tokony hiseho amin'ny tsanganana misaraka izy ireo. Afaka manao izany isika amin'ny alalan'ny famoronana famaritana izay ny tsanganana .value hanana dikany roa samy hafa.

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

Noho izany, andeha hojerentsika tsikelikely ny hetsika ataon'ny code etsy ambony.

  • pivot_longer_spec(-family) - Mamorona famaritana izay manindry ny tsanganana rehetra misy afa-tsy ny tsanganana fianakaviana.
  • separate(col = name, into = c(".value", "child")) - mizara ny tsanganana .Anarana, izay mirakitra ny anaran'ny saha loharano, amin'ny fampiasana ny tsipitsipika ary mampiditra ny sanda vokarina ao amin'ny tsanganana .value и ankizy.
  • mutate(child = parse_number(child)) - hanova ny soatoavin'ny saha ankizy avy amin'ny lahatsoratra mankany amin'ny karazana angona nomerika.

Amin'izao fotoana izao dia afaka mampihatra ny famaritana vokatra amin'ny dataframe tany am-boalohany isika ary mitondra ny latabatra amin'ny endrika tiana.

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

Mampiasa argument izahay na.rm = TRUE, satria ny endriky ny angona ankehitriny dia manery ny famoronana andalana fanampiny ho an'ny fandinihana tsy misy. SATRIA fianakaviana 2 tsy manan-janaka tokana, na.rm = TRUE miantoka fa ny fianakaviana 2 dia hanana laharana iray amin'ny vokatra.

Manova ny lamin'ny daty avy amin'ny endrika lava ho malalaka

pivot_wider() - dia ny fiovan'ny invers, ary ny mifamadika amin'izany dia mampitombo ny isan'ny tsanganana amin'ny rafitra daty amin'ny fampihenana ny isan'ny andalana.

R package tidyr sy ny asany vaovao pivot_longer sy pivot_wider

Ity karazana fanovana ity dia zara raha ampiasaina mba hitondrana angona ho amin'ny endrika marina, na izany aza, ity teknika ity dia mety ilaina amin'ny famoronana tabilao pivot ampiasaina amin'ny famelabelarana, na hampidirana fitaovana hafa.

Raha ny marina, ny asa pivot_longer() и pivot_wider() dia symmetrical, ary miteraka hetsika mifamadika, izany hoe: df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec) и df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec) hamerina ny df tany am-boalohany.

Ohatra tsotra indrindra amin'ny famadihana latabatra ho endrika malalaka

Mba hampisehoana ny fomba fiasan'ny asa pivot_wider() dia hampiasa ny datasety izahay fish_encounters, izay mitahiry vaovao momba ny fomba firaketan'ireo tobim-piantsonana samihafa ny fihetsehan'ny trondro manamorona ny renirano.

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

Amin'ny ankabeazan'ny toe-javatra, ity latabatra ity dia ho fampahalalana bebe kokoa sy mora ampiasaina raha manolotra fampahalalana ho an'ny fiantsonana tsirairay ao anaty tsanganana mitokana.

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>

Ity tahirin-kevitra ity dia mirakitra vaovao ihany rehefa hitan'ny tobim-piantsonana ny trondro, izany hoe. raha misy trondro tsy noraketin'ny tobim-piantsonana sasany, dia tsy ho eo amin'ny latabatra io angona io. Midika izany fa ho feno NA ny vokatra.

Na izany aza, amin'ity tranga ity dia fantatsika fa ny tsy fisian'ny rakitra dia midika fa tsy hita ilay trondro, ka afaka mampiasa ny tohan-kevitra isika. values_fill in function pivot_wider() ary fenoy aotra ireto sanda tsy hita ireto:

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>

Mamorona anarana tsanganana avy amin'ny fari-pahalalana maro

Alaivo sary an-tsaina hoe manana latabatra misy fitambarana vokatra, firenena ary taona isika. Mba hamoronana rafitra daty fitsapana dia azonao atao ny mampiasa ity code manaraka ity:

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

Ny andraikitray dia ny manitatra ny rafitra angon-drakitra ka misy tsanganana iray misy angona isaky ny fitambaran'ny vokatra sy firenena. Mba hanaovana izany, ampidiro fotsiny ny tohan-kevitra anarana_avy amin'ny vector misy ny anaran'ny saha hatambatra.

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

Azonao atao ihany koa ny mampihatra fepetra amin'ny asa iray pivot_wider(). Fa rehefa atolotra pivot_wider() ny famaritana dia manao ny fiovam-po mifanohitra pivot_longer(): Ireo tsanganana voalaza ao amin'ny .Anarana, mampiasa sanda avy amin'ny .value ary tsanganana hafa.

Ho an'ity angon-drakitra ity dia azonao atao ny mamorona famaritana manokana raha tianao hanana tsanganana manokana ny firenena rehetra sy ny vokatra rehetra, fa tsy izay hita ao amin'ny angona ihany:

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

Ohatra mandroso maromaro amin'ny fiasana amin'ny hevitra tidyr vaovao

Fanadiovana angon-drakitra amin'ny fampiasana ny angona US Census Income and Rent ho ohatra.

Data set antsika_manofa_bola dia misy fampahalalana momba ny vola miditra sy hofan-trano ho an'ny fanjakana rehetra any Etazonia ho an'ny taona 2017 (angona misy ao anaty fonosana 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

Amin'ny endrika itahirizana ny angona ao amin'ny angona antsika_manofa_bola Ny fiaraha-miasa amin'izy ireo dia tena sarotra, noho izany dia te hamorona angon-drakitra misy tsanganana izahay: hofan-trano, rent_moe, ho avy, fidiram-bola_moe. Misy fomba maro hamoronana ity famaritana ity, fa ny hevi-dehibe dia ny hoe mila mamorona ny fitambaran'ny soatoavina miovaova sy tombana/moeary avy eo mamorona ny anaran'ny tsanganana.

  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

Manome an'io fepetra io pivot_wider() manome antsika ny vokatra tadiavintsika:

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

Ny Banky Iraisam-pirenena

Indraindray mila dingana maromaro ny fitondrana angon-drakitra ho amin'ny endrika irina.
Dataset world_bank_pop mirakitra angona avy amin'ny Banky Iraisam-pirenena momba ny mponina ao amin'ny firenena tsirairay eo anelanelan'ny taona 2000 sy 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>

Ny tanjonay dia ny hamorona angon-drakitra milamina miaraka amin'ny fari-piainana tsirairay ao amin'ny tsanganany manokana. Tsy mazava tsara ny dingana ilaina, fa ny olana miharihary indrindra no hanombohantsika: ny taona dia miparitaka amin'ny tsanganana maro.

Mba hamahana izany dia mila mampiasa ny asa ianao 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

Ny dingana manaraka dia ny fijerena ny mari-pamantarana.
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

Raha SP.POP.GROW ny fitomboan'ny mponina, SP.POP.TOTL ny isan'ny mponina, ary SP.URB. * mitovy ihany, fa ho an'ny tanàn-dehibe ihany. Andao hizara ireo soatoavina roa ireo: faritra - faritra (total na an-tanàn-dehibe) ary fari-piainana misy angona tena izy (mponina na fitomboana):

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

Ankehitriny ny hany tsy maintsy ataontsika dia mizara ny fari-piainana ho tsanganana roa:

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

Lisitry ny fifandraisana

Ohatra iray farany, alaivo sary an-tsaina hoe manana lisitry ny fifandraisana izay nadikao sy napetanao tamin'ny tranokala iray ianao:

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

Sarotra be ny fametahana an'io lisitra io satria tsy misy fari-pahalalana mamaritra hoe iza amin'ireo fifandraisana ireo. Azontsika atao ny manamboatra izany amin'ny fanamarihana fa ny angon'ny fifandraisana vaovao tsirairay dia manomboka amin'ny "anarana", mba hahafahantsika mamorona famantarana tokana ary mampitombo izany isaky ny misy ny sanda "anarana" ny tsanganana an-tsaha:

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

Rehefa manana ID tokana ho an'ny fifandraisana tsirairay isika dia afaka mamadika ny saha sy ny sanda ho tsanganana:

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>

famaranana

Ny hevitro manokana dia ilay hevitra vaovao tidyr tena intuitive kokoa, ary tena ambony kokoa amin'ny fampiasa amin'ny asa lova spread() и gather(). Manantena aho fa nanampy anao hiatrika ity lahatsoratra ity pivot_longer() и pivot_wider().

Source: www.habr.com

Add a comment