sarcina tidyr in nucleo cuiusdam bibliothecae popularis in lingua R - tidyverse.
Praecipuum sarcinae propositum est notitias in formam accuratam afferre.
Iam praesto est Habré 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.

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 и 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 functionisseparate();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 fungiturpivot_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 fungiturgather().
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.

Nota ex auctor
Omnes textus infra adaptivi, etiam liberam translationem dicerem 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.

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 rowsMunus 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 variablesSpecificationem 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 rowsagri 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/epmorbum diagnosing modum describitur.m/fpatientis genus.014/1524/2535/3544/4554/65patienti 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 rowsQuaeso 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 rowsOmnia quae mox fecimus, schematice depingi possunt hoc modo:

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 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 1Tabulae 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 2Itaque 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 1Utimur 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.

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 rowsPleraque 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 rowsNostrum 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 rowsApplicare 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 valuedf %>% 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.594Plura 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 rowsIn 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_moeProvidemus 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 rowsOrbis 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 rowsProximus 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 4752Ubi 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 rowsNunc 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 rowsContactus 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 3Cum 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
