R involucrum conditum et nova munera eius pivot_longiores et pivot_wider

sarcina tidyr in nucleo cuiusdam bibliothecae popularis in lingua R - tidyverse.
Praecipuum sarcinae propositum est notitias in formam accuratam afferre.

Iam praesto est Habré publication huic sarcina dedicata est, sed ad MMXV redit. Et volo tibi dicere de mutationes recentissimae quae paucis ante diebus ab auctore suo Hedley Wickham nuntiatae sunt.

R involucrum conditum et nova munera eius pivot_longiores et pivot_wider

SJK: colliget et deprecabitur?

Hadley Wickham: Aliquatenus. Non amplius commendabimus usum harum functionum et cimices in illis figemus, sed perseverent in suo statu praesenti involucro adesse.

contentus

Si vos es interested in Analysis analysi, fortasse interesse in my telegraphum и YouTube rivos. Pleraque contenti r lingua dedicata est.

TidyData conceptum

propositum tidyr — Adiuva datam ad formam sic dictam elegantem affers. Commode data est ubi data;

  • Quisque varius est in columna.
  • Quaelibet observatio chorda est.
  • Singula aestimatio cellula est.

Multo facilius et commodius est operari cum notitia quae in luculentam notitias cum analysi faciendis exhibetur.

Praecipua munera in tidy sarcina inclusa

tidyr continens functiones statuas ad mensas transformandas destinatas;

  • fill() - implens valores absentes in columna cum valoribus praecedentibus;
  • separate() - scindit unum campum in plures utens separator;
  • unite() - exercet operationem plures copulandi agros in unum, actio inversa functionis separate();
  • pivot_longer() — functio quae data e forma lata ad formam longam convertitur;
  • pivot_wider() — functio quae data e forma longa ad latas formas convertitur. Contrarium operatio illius qui munere fungitur pivot_longer().
  • gather()outdated — functio quae data e forma lata ad formam longam convertitur;
  • spread()outdated — functio quae data e forma longa ad latas formas convertitur. Contrarium operatio illius qui munere fungitur gather().

Novus conceptus convertendi notitias e lato ad formam longam et e converso

Antea, munera ad huiusmodi transmutationem adhibebantur gather() и spread(). Per annos exsistentiae harum functionum apparebat quod plerisque utentibus, auctori fasciculi, nomina harum functionum earumque argumentorum non satis perspicua erant, et difficultates inveniendi et cognoscendi quae harum functionum convertuntur. frame a date a lato ad formam longam, et vice versa.

Qua de re in tidyr Duo nova, magna munera additae sunt, quae ad tabulas novas mutandas destinata sunt.

novus features pivot_longer() и pivot_wider() inspirati quidam features in sarcina cdatacreatus a Ioanne Monte et Nina Zumel.

Insertis maxime emendationem in luculentam 0.8.3.9000

Ad novam institutionem, maxime current versio sarcinae tidyr 0.8.3.9000ubi novae notae in promptu sunt, sequenti codice utere.

devtools::install_github("tidyverse/tidyr")

In tempore scribendi, haec munera tantum praesto sunt in versione fasciculi in GitHub dev.

Transitus ad novas

Re quidem vera, non difficile est vetera scripta transferre ad operandum novis functionibus; ad melius intelligendum, exemplum sumo ex documentis veterum functionum, et quomodo eadem opera peraguntur novis utentibus pivot_*() munera.

Forma lata converte ad formam longam.

Exemplum munus documentorum e codice colligentes

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

Longa forma ad latum formam convertens.

Exemplum munus documentorum propagationem e codice

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

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

Quia per exempla supra opus est pivot_longer() и pivot_wider()In originali mensa stocks columnas non enumerantur in argumentis names_to и values_to quorum nomina notis esse debent.

Mensa quae te facillime adiuvabit quomodo ad commutandum opus novum conceptum exprimet tidyr.

R involucrum conditum et nova munera eius pivot_longiores et pivot_wider

Nota ex auctor

Omnes textus infra adaptivi, etiam liberam translationem dicerem vignettes e bibliotheca publica rediviva website.

Simplex exemplum convertendi notitia e lato ad formam longam

pivot_longer () — notitias longiores facit reducendo numerum columnarum et numerum ordinum augendo.

R involucrum conditum et nova munera eius pivot_longiores et pivot_wider

Exempla quae in articulo currunt, primum opus est fasciculis necessariis coniungere;

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

Dicamus nos mensam habere cum eventibus percontationum, quae (inter alia) homines de religione sua et reditibus annuis quaesiverunt;

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

Haec tabula in ordine notitias religionis conventi continet, et reditus gradus per nomina columnarum dispersa sunt. Numerus conventi e singulis categoriis in cellis valoribus conditus est in gradu intersectio religionis et reditus. Mensam in elegantissimo forma recta afferre, satis est uti 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

Munus Argumentorum pivot_longer()

  • Primum argumentum monilibusdescribit, quibus columnis immiscet. In hoc casu omnes columnae praeter tempus.
  • ratio names_to dat nomen variabile, quod ex nominibus columnarum cacatenarum creabitur.
  • values_to dat nomen variabile quod ex notitia in valores cellularum immersarum columnarum conditarum creabitur.

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

Hoc est novum functionality sarcinam tidyrquae antea pervulgata fuit cum functionibus legatorum operando.

Specificatio est tabulae datae, quarum unicuique versuum respondet uni columnae in tabula nova outputae datae, et duae speciales columnae quae incipiunt ab;

  • .name columnae nomen originale continet.
  • .value Nomen continet columnae quae bona cellula continebit.

Reliquae columnae specificationis reflectunt quomodo columna nova exhibebit nomen columnarum compressarum a .name.

Denominatio designatio metadatae in columna nominis posita, cum uno ordine pro qualibet columna et una columna pro quolibet variabili, cum columna nomine coniuncta, haec definitio videri potest in momento confundere, sed post pauca exempla multum fiet. clarior.

Punctum specificationis est quod nova metadata pro conversione data recuperare, mutare et definire potes.

Ad operandum cum specificationibus, cum mensam a forma lata ad formam longam convertendo, functione utere pivot_longer_spec().

Qualiter hoc munus opera sit ut quodlibet corpus sumpsit et metadata sua generat modo suprascripto.

Exempli gratia, sumamus qui dataset id involucro instructum tidyr. Dataset haec notitias continet a organizatione sanitatis internationalis de incidentibus 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

Specificationem eius aedificemus.

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

agri patriam, isoxnumx, isoxnumx iam variables sunt. Nostrum negotium est ut flip columnas cum new_sp_m014 on newrel_f65.

Horum columnarum nomina sequuntur informationes reponunt:

  • praefigunt new_ indicat columnam notitias in novis tuberculosis casibus continere, hodiernae tabulae notitias tantum in novis morbis continere, ideoque haec praepositio in contextu praesenti nullam significationem habet.
  • sp/rel/sp/ep morbum diagnosing modum describitur.
  • m/f patientis genus.
  • 014/1524/2535/3544/4554/65 patienti aetate patens.

Scinditur has columnas munus uti possumus extract()expressio utens regularis.

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

Quaeso nota columnae .name cum hic noster index in columna originalis dataset immutata maneret.

Genus et aetas (columnas genus и aetate) valores fixos et notos, ideo commendatur has columnas ad factores convertendas;

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

Denique, ut specificationem adhiberemus, ad tabulam originalem datam creavimus qui opus est ut ratio spec in munus 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

Omnia quae mox fecimus, schematice depingi possunt hoc modo:

R involucrum conditum et nova munera eius pivot_longiores et pivot_wider

Specificationem per plures valores (.value)

Ut supra, specificatio columnae .value unum tantum valorem continebat, in pluribus ita est.

Sed interdum condicio oriri potest cum notitias ex columnis colligere debes cum diversis speciebus in valoribus. Usus munus legatum spread() hoc satis difficile factu est.

Exemplum infra sumitur ex vignettes ad sarcina data.table.

Disciplinam dataframe faciamus.

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

Tabulae date creatae notitias continent in singulis lineis unius familiae filiis. Familiae unum aut duos liberos habere possunt. Pro unoquoque puero, notitia pro tempore nativitatis et generis praebetur, et notitia cuiusque infantis in distinctis columnis est;

Quaeso nota quod duas variabiles notitias de unoquoque puero habemus: genus et diem nativitatis (columnas cum praepositione dob continent diem nativitatis columnae cum praepositione genus sexum pueri continent). Exspectatus effectus est, ut distinctis columnis appareant. Hoc facere possumus generando specificationem in qua est columna .value habebis duas significationes.

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

Itaque gradatim inspicere actiones quae a codice superiore factae sunt.

  • pivot_longer_spec(-family) — speciem creare quae omnes columnas exsistentes comprimit praeter columnam familiarem.
  • separate(col = name, into = c(".value", "child")) - scindendum agmen .name, quae nomina agrorum fontium continet , subscore minorum et introitus valorum consequentium in columnas .value и puer.
  • mutate(child = parse_number(child)) - transform agrum values puer ex textu ad genus numerorum notitia.

Nunc ad specificationem inde datam ad originalem tabulam applicare possumus et mensam ad formam desideratam adducere.

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

Utimur argument! na.rm = TRUEquia hodierna forma notitiarum extra ordines creationem cogit observationibus non existentibus. Quia 2 familia tantum unum puerum habet; na.rm = TRUE fideiussores familiae 2 unum ordinem in output habebunt.

Convertere diem tabulae a longa ad latum forma

pivot_wider() — Mutatio inversa est, et e converso multiplicat columnas tabularum ad numerum ordinum reducendo numerum.

R involucrum conditum et nova munera eius pivot_longiores et pivot_wider

Huiusmodi transformationis genus perquam raro notitias in formam accuratam afferre solebat, attamen haec ars utilis esse potest ad mensas versorias adhibendas in presentationibus conficiendis, vel ad integrationem cum quibusdam aliis instrumentis.

Nam munera pivot_longer() и pivot_wider() symmetria, et actiones inter se reciproce, i.e. df %>% pivot_longer(spec = spec) %>% pivot_wider(spec = spec) и df %>% pivot_wider(spec = spec) %>% pivot_longer(spec = spec) DF in originali reddet.

Exemplum simplicissimum de conversione mensa ad formam latam

Ad demonstrandum quomodo munus operatur pivot_wider() nos uti dataset fish_encountersqui notitias refert quomodo variae stationes motus piscium per flumen recordentur.

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

Pleraque haec tabula magis informativus et facilior erit, si singulas stationes in columna separata exhibeas notitias.

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>

Haec notitia sola relata nuntiat cum pisces in statione detecti sunt, i.e. si quis piscis non scribatur ab aliquo statio, haec data non erit in mensa. Hoc modo implebitur output cum NA.

Sed in hoc casu cognoscimus absentiam recordum significat quod piscem non videri, ideo argumento uti possumus values_fill in munus pivot_wider() et haec absentis valores cyphris implent:

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>

Nomen columnae generans ex multiplici fonte variabilium

Finge nos mensam habere complexionem producti, patriae et anni. Ad tabulam testam generandam, sequenti codice currere potes:

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

Nostrum negotium est dilatare tabulas datas ut una columna notitia contineat pro unaquaque complexione producti et nationis. Ad hoc age in argumento names_from nomina agrorum quibus vector immiscet.

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

Applicare potes specificationes ad munus pivot_wider(). Sed cum in summitto pivot_wider() oppositum conversionis specificatio facit pivot_longer(): Columnae specificatae in .name, values ​​​​usura a .value et aliis columnis.

Ad hoc dataset, generare consuetudinis specificationem si vis omnem regionem possibilem et productum complexionem suam habere columnam suam, non solum ea quae sunt in notitia;

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

Plura exempla provectus operandi cum novo conceptu luculento

Purgatio sursum notitia usura Census Reditus et Rent dataset exemplum.

Dataset us_rent_income continet medianus reditus et scissuras informationes pro omni statu in US pro MMXVII (notitia paro available in sarcina 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

In forma qua data reponitur in dataset us_rent_income cum illis operando perquam incommodum est, ita veli datam cum columnis creare; redditum, rent_moe, venit, reditus_moe. Multi modi sunt hanc specificationem creare, sed Praecipuum est quod omne compositum opus variabilium valorum generare oportet estimate / moeet tunc generant columnae nomen.

  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

Providemus hanc speciem pivot_wider() nobis dat eventum quod quaerimus:

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

Orbis Terrarum

Aliquando notitia iniecta in optatam formam afferens plures gradus requirit.
Dataset world_bank_pop Mundus Bank notitias continet in incolarum cuiusque regionis inter MM et MMXVIII.

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

Propositum est notitias elegantes in sua columna constituere singulas variabiles. Incertum est quid requirantur vestigia, sed incipiemus problema manifestissima: annus per plures columnas diffunditur.

Ut hoc munus figere debes uti 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

Proximus gradus est intueri indicatorem variabilem.
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

Ubi SP.POP.GROW incolarum incrementum est, SP.POP.TOTL multitudo est, et SP.URB. idem*, sed urbanis tantum locis. Istos valores dividamus in duas variabiles: aream - aream (totalem vel urbanam) et variabilem in quibus ipsa notitia continetur (populatio vel incrementum);

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

Nunc omnia facienda scinditur variabilis in duas columnas;

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

Contactus index

Unum extremum exemplum, puta te habere indicem notorum quem exscripsisti et conglutinasti e loco interretiali:

contacts <- tribble(
  ~field, ~value,
  "name", "Jiena McLellan",
  "company", "Toyota", 
  "name", "John Smith", 
  "company", "google", 
  "email", "john@google.com",
  "name", "Huxley Ratcliffe"
)

Hoc indicem tabulare admodum difficile est, quia nulla variabilis est quae agnoscit quae ad quem contactum pertineat notitia. Hoc figere possumus notando singulas notitias novi contactus cum "nomine" incipere, ita nos singularem identificantem atque incrementum creare possumus unoquoque tempore agri columnae valorem "nomen" continere;

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   john@google.com          2
#> 6 name    Huxley Ratcliffe         3

Cum ID singularem habemus ad invicem contactum, campum et valorem in columnas vertere possumus;

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  john@google.com
#> 3         3 Huxley Ratcliffe <NA>    <NA>

conclusio,

Mea propria opinio est novum conceptum tidyr vere magis intuitive et signanter superior in functionibus ad functiones legatas spread() и gather(). Spero hunc articulum adiuvisti facies pivot_longer() и pivot_wider().

Source: www.habr.com

Emptum certos hospites pro locis cum praesidio DDoS, VPS VDS servers 🔥 Eme hospitium interretiale fidum cum praesidio DDoS, servitores VPS VDS | ProHoster