R pacáiste tidyr agus a fheidhmeanna nua pivot_longer agus pivot_wider

Pacáiste slachtmhar san áireamh i gcroílár cheann de na leabharlanna is coitianta sa teanga R - slachtmhar.
Is é príomhchuspóir an phacáiste na sonraí a thabhairt i bhfoirm chruinn.

Ar fáil cheana féin ar Habré foilseachán tiomnaithe don phacáiste seo, ach téann sé siar go dtí 2015. Agus ba mhaith liom a insint duit faoi na hathruithe is déanaí, a d'fhógair a údar, Hedley Wickham cúpla lá ó shin.

R pacáiste tidyr agus a fheidhmeanna nua pivot_longer agus pivot_wider

SJK: An ndéanfar bailiú() agus scaipeadh() a dhímheas?

Hadley Wickham: Go pointe áirithe. Ní mholfaimid úsáid na bhfeidhmeanna seo a thuilleadh agus fabhtanna a shocrú iontu, ach leanfaidh siad de bheith i láthair sa phacáiste ina staid reatha.

Ábhar

Má tá suim agat in anailís sonraí, b'fhéidir go mbeadh suim agat i mo chuid teileagram и youtube cainéil. Tá an chuid is mó den ábhar tiomnaithe don teanga R.

Coincheap TidyData

Sprioc slachtmhar — cabhrú leat na sonraí a thabhairt chuig foirm néata mar a thugtar air. Sonraí is ea sonraí néata nuair:

  • Tá gach athróg i gcolún.
  • Is teaghrán é gach breathnóireacht.
  • Is cill gach luach.

Tá sé i bhfad níos éasca agus níos áisiúla oibriú le sonraí a chuirtear i láthair i sonraí slachtmhara agus anailís á déanamh.

Príomhfheidhmeanna san áireamh sa phacáiste slachtmhar

tá sraith feidhmeanna ag tidyr atá deartha chun táblaí a athrú:

  • fill() — luachanna atá in easnamh a líonadh i gcolún le luachanna roimhe seo;
  • separate() — roinntear réimse amháin ina roinnt ag baint úsáide as deighilteoir;
  • unite() — a fheidhmíonn an oibríocht trí roinnt réimsí a chomhcheangal in aon ghníomhaíocht inbhéartach na feidhme separate();
  • pivot_longer() — feidhm a thiontaíonn sonraí ó fhormáid leathan go formáid fhada;
  • pivot_wider() - feidhm a thiontaíonn sonraí ó fhormáid fhada go formáid leathan. Oibriú droim ar ais an ceann a dhéanann an fheidhm pivot_longer().
  • gather()imithe i léig — feidhm a thiontaíonn sonraí ó fhormáid leathan go formáid fhada;
  • spread()imithe i léig - feidhm a thiontaíonn sonraí ó fhormáid fhada go formáid leathan. Oibriú droim ar ais an ceann a dhéanann an fheidhm gather().

Coincheap nua chun sonraí a thiontú ó fhormáid leathan go formáid fhada agus vice versa

Roimhe seo, úsáideadh feidhmeanna don chineál seo claochlaithe gather() и spread(). Thar na blianta a bhí na feidhmeanna seo ann, ba léir don chuid is mó d’úsáideoirí, lena n-áirítear údar an phacáiste, nach raibh ainmneacha na bhfeidhmeanna seo agus a n-argóintí sách soiléir, agus ba chúis le deacrachtaí iad a aimsiú agus a thuiscint cé acu de na feidhmeanna sin a athraíonn. fráma dáta ó fhormáid leathan go formáid fhada, agus vice versa.

Maidir leis seo, in slachtmhar Tá dhá fheidhm nua, thábhachtacha curtha leis atá deartha chun frámaí dáta a athrú.

Gnéithe nua pivot_longer() и pivot_wider() spreag cuid de na gnéithe sa phacáiste iad cdata, cruthaithe ag John Mount agus Nina Zumel.

Suiteáil an leagan is déanaí de tidyr 0.8.3.9000

Chun an leagan nua, is déanaí den phacáiste a shuiteáil slachtmhar 0.8.3.9000, áit a bhfuil gnéithe nua ar fáil, bain úsáid as an gcód seo a leanas.

devtools::install_github("tidyverse/tidyr")

Agus é seo á scríobh, níl na feidhmeanna seo ar fáil ach amháin sa leagan dev den phacáiste ar GitHub.

Aistriú chuig gnéithe nua

Go deimhin, níl sé deacair sean-scripteanna a aistriú chun oibriú le feidhmeanna nua; chun tuiscint níos fearr a fháil, tógfaidh mé sampla ó dhoiciméadú na seanfheidhmeanna agus taispeánfaidh mé conas a dhéantar na hoibríochtaí céanna ag baint úsáide as cinn nua pivot_*() feidhmeanna.

Tiontaigh formáid leathan go formáid fhada.

Cód samplach ó dhoiciméadú an fheidhm a bhailiú

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

Formáid fhada a thiontú go formáid leathan.

Cód samplach ó dhoiciméadú feidhm leata

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

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

Mar sna samplaí thuas de bheith ag obair le pivot_longer() и pivot_wider(), sa tábla bunaidh stoic níl aon cholúin liostaithe sna hargóintí ainmneacha_chuig и luachanna_chuig caithfidh a n-ainmneacha a bheith i gcomharthaí athfhriotail.

Tábla a chabhróidh leat a dhéanamh amach go héasca conas athrú go dtí oibriú le coincheap nua slachtmhar.

R pacáiste tidyr agus a fheidhmeanna nua pivot_longer agus pivot_wider

Nóta ón údar

Tá an téacs ar fad thíos oiriúnaitheach, déarfainn fiú aistriúchán saor in aisce vignettes ó láithreán gréasáin oifigiúil na leabharlainne tidyverse.

Sampla simplí de shonraí a thiontú ó fhormáid leathan go formáid fhada

pivot_longer () — déanann sé tacair sonraí níos faide trí líon na gcolún a laghdú agus líon na rónna a mhéadú.

R pacáiste tidyr agus a fheidhmeanna nua pivot_longer agus pivot_wider

Chun na samplaí a chuirtear i láthair san alt a rith, ní mór duit na pacáistí riachtanacha a nascadh ar dtús:

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

Ligean le rá go bhfuil tábla againn le torthaí suirbhé a chuir (i measc rudaí eile) ceist ar dhaoine faoina reiligiún agus faoina n-ioncam bliantúil:

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

Sa tábla seo tá sonraí reiligiúin na bhfreagróirí i sraitheanna, agus tá leibhéil ioncaim scaipthe ar fud ainmneacha na gcolún. Stóráiltear líon na bhfreagróirí ó gach catagóir sna luachanna cille ag an áit a dtrasnaíonn reiligiún agus leibhéal ioncaim. Chun an tábla a thabhairt isteach i bhformáid néata, cheart, is leor é a úsáid 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

Argóintí Feidhme pivot_longer()

  • An chéad argóint coiléar, cur síos ar na colúin is gá a chumasc. Sa chás seo, gach colún ach amháin am.
  • Argóint ainmneacha_chuig tugann sé ainm na hathróige a chruthófar ó ainmneacha na gcolún a chomhcheangail muid.
  • luachanna_chuig tugann sé ainm athróige a chruthófar ó na sonraí atá stóráilte i luachanna cealla na gcolún cumaiscthe.

Sonraíochtaí

Feidhmiúlacht nua den phacáiste é seo slachtmhar, nach raibh ar fáil roimhe seo agus tú ag obair le feidhmeanna oidhreachta.

Is fráma sonraí é sonraíocht, a gcomhfhreagraíonn gach sraith de do cholún amháin sa fhráma dáta aschuir nua, agus dhá cholún speisialta a thosaíonn le:

  • . Ainm tá bunainm an cholúin.
  • .luach ina bhfuil ainm an cholúin ina mbeidh na luachanna cille.

Léiríonn na colúin atá fágtha den tsonraíocht conas a thaispeánfaidh an colún nua ainm na gcolún comhbhrúite ó . Ainm.

Déanann an tsonraíocht cur síos ar na meiteashonraí atá stóráilte in ainm colún, le ró amháin do gach colún agus colún amháin do gach athróg, in éineacht le hainm an cholúin, d'fhéadfadh cuma mearbhall a bheith ar an sainmhíniú seo faoi láthair, ach tar éis breathnú ar roinnt samplaí beidh sé i bhfad níos soiléire.

Is é pointe na sonraíochta gur féidir leat meiteashonraí nua a aisghabháil, a mhodhnú agus a shainiú don fhráma sonraí atá á thiontú.

Chun oibriú le sonraíochtaí agus tábla á thiontú ó fhormáid leathan go formáid fhada, bain úsáid as an fheidhm pivot_longer_spec().

Is é an chaoi a n-oibríonn an fheidhm seo ná go dtógann sé aon fhráma dáta agus go ngineann sé a meiteashonraí ar an modh a thuairiscítear thuas.

Mar shampla, déanaimis an tacar sonraí cé a chuirtear ar fáil leis an bpacáiste a ghlacadh slachtmhar. Tá faisnéis sa tacar sonraí seo a chuir an eagraíocht idirnáisiúnta sláinte ar fáil ar mhinicíocht na heitinne.

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

Déanaimis a shonraíocht a thógáil.

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

Réimse tír, isoxnumx, isoxnumx atá ina n-athróga cheana féin. Is é an tasc atá againn ná na colúin a smeach le nua_sp_m014 ar nua_f65.

Stórálann ainmneacha na gcolún seo an t-eolas seo a leanas:

  • Réamhrá new_ le fios go bhfuil sonraí sa cholún ar chásanna nua eitinn, níl faisnéis sa fhráma dáta reatha ach ar ghalair nua, agus mar sin níl aon chiall leis an réimír seo sa chomhthéacs reatha.
  • sp/rel/sp/ep cur síos ar mhodh chun galar a dhiagnóisiú.
  • m/f inscne an othair.
  • 014/1524/2535/3544/4554/65 raon aoise othar.

Is féidir linn na colúin seo a roinnt leis an bhfeidhm extract()ag baint úsáide as abairt rialta.

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

Tabhair faoi deara an colún . Ainm Ba cheart go bhfanfadh sé gan athrú ós rud é gurb é seo ár n-innéacs in ainmneacha colúin an bhunachair shonraí.

Inscne agus aois (colúin inscne и aois) go bhfuil luachanna seasta agus ar eolas acu, mar sin moltar na colúin seo a thiontú go fachtóirí:

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

Ar deireadh, d'fhonn an tsonraíocht a chruthaigh muid a chur i bhfeidhm ar an bhfráma dáta bunaidh a caithfimid argóint a úsáid Sonraíocht i bhfeidhm 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

Is féidir gach rud a rinne muid díreach a léiriú go scéimreach mar seo a leanas:

R pacáiste tidyr agus a fheidhmeanna nua pivot_longer agus pivot_wider

Sonraíocht ag baint úsáide as luachanna iolracha (.value)

Sa sampla thuas, an colún sonraíochta .luach nach bhfuil ach luach amháin ann, is é seo an cás i bhformhór na gcásanna.

Ach ó am go chéile d’fhéadfadh cás teacht chun cinn nuair is gá duit sonraí a bhailiú ó cholúin le cineálacha éagsúla sonraí i luachanna. Ag baint úsáide as feidhm oidhreachta spread() bheadh ​​sé seo deacair go leor a dhéanamh.

Tógtar an sampla thíos ó vignettes chuig an bpacáiste sonraí.tábla.

Déanaimis fráma sonraí oiliúna a chruthú.

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

Tá sonraí sa bhfráma dáta cruthaithe ar leanaí de theaghlach amháin i ngach líne. D’fhéadfadh páiste amháin nó beirt a bheith ag teaghlaigh. I gcás gach linbh, soláthraítear sonraí ar dháta breithe agus inscne, agus tá na sonraí do gach leanbh i gcolúin ar leith; is é an tasc atá againn na sonraí seo a thabhairt go dtí an fhormáid cheart le haghaidh anailíse.

Tabhair faoi deara le do thoil go bhfuil dhá athróg againn le faisnéis faoi gach leanbh: a n-inscne agus dáta breithe (colúin leis an réimír DOP ina bhfuil dáta breithe, colúin le réimír inscne go bhfuil gnéas an linbh). Is é an toradh a bhfuiltear ag súil leis ná gur chóir go mbeadh siad le feiceáil i gcolúin ar leith. Is féidir linn é seo a dhéanamh trí shonraíocht a ghiniúint ina bhfuil an colún .value beidh dhá bhrí éagsúla.

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

Mar sin, déanaimis breathnú céim ar chéim ar na gníomhartha a dhéanann an cód thuas.

  • pivot_longer_spec(-family) — cruthaigh sonraíocht a chomhbhrúigh na colúin go léir atá ann cheana féin ach amháin an colún teaghlaigh.
  • separate(col = name, into = c(".value", "child")) - scoilt an colún . Ainm, ina bhfuil ainmneacha na réimsí foinse, ag baint úsáide as an underscore agus ag dul isteach na luachanna mar thoradh air isteach sna colúin .luach и leanbh.
  • mutate(child = parse_number(child)) — na luachanna allamuigh a athrú leanbh ó théacs go cineál sonraí uimhriúla.

Anois is féidir linn an tsonraíocht mar thoradh air a chur i bhfeidhm ar an bhfráma sonraí bunaidh agus an tábla a thabhairt chuig an bhfoirm atá ag teastáil.

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

Bainimid úsáid as argóint na.rm = TRUE, toisc go gcuireann foirm reatha na sonraí brú ar rónna breise a chruthú le haghaidh breathnuithe nach bhfuil ann. Mar níl ach leanbh amháin ag teaghlach 2, na.rm = TRUE ráthaíochtaí go mbeidh sraith amháin ag teaghlach 2 san aschur.

Frámaí dáta a thiontú ó fhormáid fhada go bhformáid leathan

pivot_wider() - is é an claochlú inbhéartach é, agus vice versa méadaítear líon na gcolún den fhráma dáta trí líon na sraitheanna a laghdú.

R pacáiste tidyr agus a fheidhmeanna nua pivot_longer agus pivot_wider

Is fíor-annamh a úsáidtear an cineál claochlaithe seo chun sonraí a thabhairt i bhfoirm chruinn, áfach, is féidir leis an teicníc seo a bheith úsáideach chun táblaí maighdeogacha a chruthú a úsáidtear i gcur i láthair, nó chun comhtháthú le roinnt uirlisí eile.

I ndáiríre na feidhmeanna pivot_longer() и pivot_wider() atá siméadrach, agus cuireann siad gníomhartha inbhéartach lena chéile, i.e.: df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec) и df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec) seolfaidh sé an bun df ar ais.

An sampla is simplí de tábla a thiontú go formáid leathan

Chun a léiriú conas a oibríonn an fheidhm pivot_wider() úsáidfimid an tacar sonraí fish_encounters, a stórálann faisnéis faoin gcaoi a ndéanann stáisiúin éagsúla taifead ar ghluaiseacht éisc feadh na habhann.

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

I bhformhór na gcásanna, beidh an tábla seo níos faisnéiseach agus níos fusa le húsáid má chuireann tú faisnéis do gach stáisiún i láthair i gcolún ar leith.

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>

Ní dhéanann an tacar sonraí seo ach faisnéis a thaifeadadh nuair a bhíonn iasc braite ag an stáisiún, i.e. más rud é nár thaifead stáisiún éigin aon iasc, ní bheidh na sonraí seo sa tábla. Ciallaíonn sé seo go líonfar an t-aschur le NA.

Mar sin féin, sa chás seo tá a fhios againn go gciallaíonn an easpa taifead nach raibh an t-iasc le feiceáil, mar sin is féidir linn úsáid a bhaint as an argóint luachanna_líon i bhfeidhm pivot_wider() agus líon na luachanna in easnamh seo le nialais:

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>

Ainm colúin a ghiniúint ó athróga foinse iolracha

Samhlaigh go bhfuil tábla againn ina bhfuil meascán de tháirge, de thír agus de bhliain. Chun fráma dáta tástála a ghiniúint, is féidir leat an cód seo a leanas a rith:

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

Is é an tasc atá againn ná an fráma sonraí a leathnú ionas go mbeidh sonraí le haghaidh gach teaglaim de tháirge agus de thír i gcolún amháin. Chun seo a dhéanamh, ach pas a fháil san argóint ainmneacha_ó veicteoir ina bhfuil ainmneacha na réimsí atá le cumasc.

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

Is féidir leat sonraíochtaí a chur i bhfeidhm ar fheidhm freisin pivot_wider(). Ach nuair a chuirtear faoi bhráid pivot_wider() déanann an tsonraíocht a mhalairt de chomhshó pivot_longer(): Na colúin atá sonraithe i . Ainm, ag baint úsáide as luachanna ó .luach agus colúin eile.

Maidir leis an tacar sonraí seo, is féidir leat sonraíocht shaincheaptha a ghiniúint más mian leat go mbeadh a cholún féin ag gach tír agus comhcheangal táirgí féideartha, ní hamháin na cinn atá sna sonraí:

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

Roinnt samplaí ardchéime de bheith ag obair leis an gcoincheap nua slachtmhar

Sonraí a ghlanadh ag úsáid tacar sonraí Ioncaim agus Cíosa Dhaonáireamh SAM mar shampla.

Tacar sonraí dúinn_cíos_ioncam ina bhfuil ioncam airmheánach agus faisnéis chíosa do gach stát sna SA don bhliain 2017 (tacar sonraí ar fáil sa phacáiste daonáireamh slachtmhar).

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

San fhoirm ina stóráiltear na sonraí sa tacar sonraí dúinn_cíos_ioncam tá sé thar a bheith deacair oibriú leo, mar sin ba mhaith linn tacar sonraí a chruthú le colúin: cíos, cíos_moe, Tar, ioncam_moe. Tá go leor bealaí ann chun an tsonraíocht seo a chruthú, ach is é an príomhphointe ná go gcaithfimid gach teaglaim de luachanna athraitheacha a ghiniúint agus meastachán/moeagus ansin ainm an cholúin a ghiniúint.

  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

An tsonraíocht seo a sholáthar pivot_wider() tugann sé dúinn an toradh atá á lorg againn:

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

An Banc Domhanda

Uaireanta tá gá le roinnt céimeanna chun tacar sonraí a thabhairt isteach san fhoirm inmhianaithe.
Tacar sonraí world_banc_pop ina bhfuil sonraí an Bhainc Dhomhanda ar dhaonra gach tíre idir 2000 agus 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>

Is é an sprioc atá againn ná tacar sonraí néata a chruthú le gach athróg ina cholún féin. Níl sé soiléir go díreach cad iad na céimeanna atá ag teastáil, ach cuirfimid tús leis an bhfadhb is soiléire: tá an bhliain scaipthe thar cholúin iolracha.

Chun é seo a shocrú ní mór duit an fheidhm a úsáid 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

Is é an chéad chéim eile breathnú ar an athróg táscaire.
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

Nuair is fás daonra é SP.POP.GROW, is é SP.POP.TOTL an daonra iomlán, agus SP.URB. * an rud céanna, ach amháin do cheantair uirbeacha. Déanaimis na luachanna seo a roinnt ina dhá athróg: limistéar - achar (iomlán nó uirbeach) agus athróg ina bhfuil sonraí iarbhír (daonra nó fás):

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

Níl le déanamh againn anois ach an t-athróg a roinnt ina dhá cholún:

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

Liosta teagmhála

Sampla deireanach amháin, samhlaigh go bhfuil liosta teagmhála agat a chóipeáil tú agus a ghreamaigh tú ó shuíomh Gréasáin:

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

Tá sé deacair go leor tábla a chur ar an liosta seo mar níl aon athróg ann a shainaithníonn cé na sonraí lena mbaineann an teagmháil. Is féidir linn é seo a shocrú trí thabhairt faoi deara go dtosaíonn sonraí gach teagmhálaí nua le "ainm", ionas gur féidir linn aitheantóir uathúil a chruthú agus é a mhéadú faoi cheann gach uair a bhfuil an luach "ainm" sa cholún réimse:

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

Anois agus aitheantas uathúil againn do gach teagmhálaí, is féidir linn an réimse agus an luach a iompú ina gcolúin:

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>

Conclúid

Is é mo thuairim phearsanta go bhfuil an coincheap nua slachtmhar i ndáiríre níos iomasach, agus i bhfad níos fearr ó thaobh feidhmiúlacht na feidhmeanna oidhreacht spread() и gather(). Tá súil agam gur chabhraigh an t-alt seo leat déileáil leis pivot_longer() и pivot_wider().

Foinse: will.com

Add a comment