Postać wąska i szeroka danych z bibliotekami tidyr i reshape2
Inspiracją do napisania tego notebooka jest rodział 15.3 książki Jareda P. Landera “R dla każdego. Zaawansowane analizy i grafika statystyczna” (zobacz [1]). Dane wykorzystane pochodzą również ze strony Jareda P. Landera (zobacz [2]).
Korzystamy z
- R (zobacz [3]),
- bibliotek R (zobacz [4–7]),
- piszemy używając języka znaczników i biblioteki rmarkdown (zobacz [8, 9]) w RStudio z wykorzystaniem R Notebook.
Uwaga:
- Kod podczytanie bibliotek jest ukryty.
Czyścimy przestrzeń nazw (środowisko)
Podczytujemy biblioteki dplyr i tidyr
Wczytanie danych
Wczytujemy dane i oglądamy (zapisane są w pliku Aid_00.RData).
load("Aid_00.RData")
Aid_00 %>% head
Dane są w postaci szerokiej.
Przekształcenie do postaci wąskiej
Przekształcimy je do postaci wąskiej (funkcja pivot_longer) z drobnym uporządkowaniem (funkcja arrange).
Aid_00.Long.pivot <- Aid_00 %>%
pivot_longer(
-c(Country.Name, Program.Name),
names_to = "Year",
values_to = "Dollars"
) %>%
arrange(Country.Name, Year)
Obejrzymy pierwsze wiersze.
Aid_00.Long.pivot %>% head
Przekształcenie do postaci szerokiej
I z powrotem do postaci szerokiej wykorzystując funkcję pivot_wider.
Aid_00.Wider.pivot <- Aid_00.Long.pivot %>%
pivot_wider(
names_from = Year,
values_from = Dollars
) %>%
arrange(Country.Name, Program.Name)
I znowu oglądamy.
Aid_00.Wider.pivot %>% head
Stare wersje funkcji przekształcających do postaci wąskiej i szerokiej w bibliotece tidyr
Uwaga
Istnieją stare wersje funkcji przekształcających do postaci wąskiej i szereokiej w pakiecie tidyr.
Funkcja gather.
Aid_00.Long.gather <- Aid_00 %>%
gather(
key = "Year",
value = "Dollars",
-Country.Name, -Program.Name
)
Aid_00.Long.gather %>% head
Funkcja spread.
Aid_00.Wider.spread <- Aid_00.Long.gather %>%
spread(
key = Year,
value = Dollars
)
Aid_00.Wider.spread %>% head
Funkcje z biblioteki reshape2
Można też używać funkcji: melt i dcast z biblioteki reshape2.
Podczytujemy bibliotekę reshape2.
Aid_00.Long.melt <- Aid_00 %>%
melt(
id.vars = c("Country.Name", "Program.Name"),
variable.name = "Year",
value.name = "Dollars")
Aid_00.Long.melt %>% head
Aid_00.Wider.dcast <- Aid_00.Long.melt %>%
dcast(
Country.Name + Program.Name ~ Year,
value.var = "Dollars"
)
Aid_00.Wider.dcast %>% head
Możemy je oglądąc z wykorzystaniem pakietu DT
Podczytujemy bibliotekę DT.
Postać wąska
Aid_00.Long.pivot %>% datatable
Postać szeroka
Aid_00.Wider.pivot %>% datatable
Na koniec usuwamy ze środowiska biblioteki.
LS0tDQp0aXRsZTogIlByYWNhIHogZGFueW1pIC0gY3rEmcWbxIcgZHJ1Z2EiDQphdXRob3I6IA0KICAtIEphcm9zxYJhdyBLb3Rvd2ljejoNCiAgICAgIGluc3RpdHV0ZTogDQogICAgICAgIC0gSUlVd0INCiAgICAgIGNvcnJlc3BvbmRlbmNlOiBmYWxzZQ0KICAgICAgZW1haWw6IGoua290b3dpY3pAdXdiLmVkdS5wbA0KZGF0ZTogIjQgbWFyY2EgMjAyMCINCmFsd2F5c19hbGxvd19odG1sOiB0cnVlDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHBhbmRvY19hcmdzOg0KICAgICAgLSAtLWx1YS1maWx0ZXI9c2Nob2xhcmx5LW1ldGFkYXRhLmx1YQ0KICAgICAgLSAtLWx1YS1maWx0ZXI9YXV0aG9yLWluZm8tYmxvY2tzLmx1YQ0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIHRvYzogeWVzDQppbnN0aXR1dGU6IA0KICAtIElJVXdCOiBaYWvFgmFkIEJpb2luZm9ybWF0eWtpLCBJbnN0eXR1dCBJbmZvcm1hdHlraSwgVW5pd2Vyc3l0ZXQgdyBCaWHFgnltc3Rva3UNCmNzbDogdGhlLWFubmFscy1vZi1hcHBsaWVkLXByb2JhYmlsaXR5LmNzbA0KYmlibGlvZ3JhcGh5OiBJbmZFa28uYmliDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBQb3N0YcSHIHfEhXNrYSBpIHN6ZXJva2EgZGFueWNoIHogYmlibGlvdGVrYW1pICoqdGlkeXIqKiBpICoqcmVzaGFwZTIqKg0KDQpJbnNwaXJhY2rEhSBkbyBuYXBpc2FuaWEgdGVnbyAqbm90ZWJvb2thKiBqZXN0IHJvZHppYcWCIDE1LjMga3NpxIXFvGtpIEphcmVkYSBQLiBMYW5kZXJhICoiUiBkbGEga2HFvGRlZ28uIFphYXdhbnNvd2FuZSBhbmFsaXp5IGkgZ3JhZmlrYSBzdGF0eXN0eWN6bmEiKiAoem9iYWN6IFtAbGFuZGVyX1JkS10pLiBEYW5lIHd5a29yenlzdGFuZSBwb2Nob2R6xIUgcsOzd25pZcW8IHplIHN0cm9ueSBKYXJlZGEgUC4gTGFuZGVyYSAoem9iYWN6IFtAd2Vic2l0ZV9sYW5kZXJfUmRLXSkuDQoNCktvcnp5c3RhbXkgeiANCg0KMS4gUiAoem9iYWN6IFtAbGFuZ3VhZ2VfUl0pLA0KMi4gYmlibGlvdGVrIFIgKHpvYmFjeiBbQHBhY2thZ2VfZHBseXI7IEBwYWNrYWdlX3RpZHlyOyBAcGFja2FnZV9yZXNoYXBlMjsgQHBhY2thZ2VfRFRdKSwNCjMuIHBpc3plbXkgdcW8eXdhasSFYyBqxJl6eWthIHpuYWN6bmlrw7N3IGkgYmlibGlvdGVraSAqKnJtYXJrZG93bioqICh6b2JhY3ogW0Bib29rX3JtYXJrZG93bjsgQHBhY2thZ2Vfcm1hcmtkb3duXSkgdyAqKlJTdHVkaW8qKiB6IHd5a29yenlzdGFuaWVtICoqUiBOb3RlYm9vayoqLg0KDQpVd2FnYToNCg0KKiBLb2QgcG9kY3p5dGFuaWUgYmlibGlvdGVrIGplc3QgdWtyeXR5Lg0KDQojIyBDennFm2NpbXkgcHJ6ZXN0cnplxYQgbmF6dyAoxZtyb2Rvd2lza28pDQoNCmBgYHtyIGN6eXN6Y3plbmllX2RhbnljaH0NCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCiMjIFBvZGN6eXR1amVteSBiaWJsaW90ZWtpICoqZHBseXIqKiBpICoqdGlkeXIqKg0KDQpgYGB7ciBwYWtpZXR5LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpgYGANCg0KIyMgV2N6eXRhbmllIGRhbnljaA0KDQpXY3p5dHVqZW15IGRhbmUgaSBvZ2zEhWRhbXkgKHphcGlzYW5lIHPEhSB3IHBsaWt1ICoqQWlkXzAwLlJEYXRhKiopLg0KYGBge3IgbG9hZF9BaWRfMDB9DQpsb2FkKCJBaWRfMDAuUkRhdGEiKQ0KDQpBaWRfMDAgJT4lIGhlYWQNCmBgYA0KDQpEYW5lIHPEhSB3IHBvc3RhY2kgc3plcm9raWVqLg0KDQojIyBQcnpla3N6dGHFgmNlbmllIGRvIHBvc3RhY2kgKnfEhXNraWVqKg0KDQpQcnpla3N6dGHFgmNpbXkgamUgZG8gcG9zdGFjaSAqd8SFc2tpZWoqIChmdW5rY2phICoqcGl2b3RfbG9uZ2VyKiopIHogZHJvYm55bSB1cG9yesSFZGtvd2FuaWVtIChmdW5rY2phICoqYXJyYW5nZSoqKS4NCmBgYHtyIGxvbmdfcGl2b3R9DQpBaWRfMDAuTG9uZy5waXZvdCA8LSBBaWRfMDAgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICAtYyhDb3VudHJ5Lk5hbWUsIFByb2dyYW0uTmFtZSksDQogICAgbmFtZXNfdG8gPSAiWWVhciIsDQogICAgdmFsdWVzX3RvID0gIkRvbGxhcnMiDQogICkgJT4lDQogIGFycmFuZ2UoQ291bnRyeS5OYW1lLCBZZWFyKQ0KYGBgDQoNCk9iZWpyenlteSBwaWVyd3N6ZSB3aWVyc3plLg0KYGBge3IgbG9uZ19waXZvdF8wMX0NCkFpZF8wMC5Mb25nLnBpdm90ICU+JSBoZWFkDQpgYGANCg0KIyMgUHJ6ZWtzenRhxYJjZW5pZSBkbyBwb3N0YWNpICpzemVyb2tpZWoqDQoNCkkgeiBwb3dyb3RlbSBkbyBwb3N0YWNpICpzemVyb2tpZWoqIHd5a29yenlzdHVqxIVjIGZ1bmtjasSZICoqcGl2b3Rfd2lkZXIqKi4NCmBgYHtyIFdpZGVyX3Bpdm90fQ0KQWlkXzAwLldpZGVyLnBpdm90IDwtIEFpZF8wMC5Mb25nLnBpdm90ICU+JQ0KICBwaXZvdF93aWRlcigNCiAgICBuYW1lc19mcm9tID0gWWVhciwNCiAgICB2YWx1ZXNfZnJvbSA9IERvbGxhcnMNCiAgKSAlPiUNCiAgYXJyYW5nZShDb3VudHJ5Lk5hbWUsIFByb2dyYW0uTmFtZSkNCmBgYA0KDQpJIHpub3d1IG9nbMSFZGFteS4NCmBgYHtyIFdpZGVyX3Bpdm90XzAxfQ0KQWlkXzAwLldpZGVyLnBpdm90ICU+JSBoZWFkDQpgYGANCg0KDQojIyBTdGFyZSB3ZXJzamUgZnVua2NqaSBwcnpla3N6dGHFgmNhasSFY3ljaCBkbyBwb3N0YWNpIHfEhXNraWVqIGkgc3plcm9raWVqIHcgYmlibGlvdGVjZSAqKnRpZHlyKioNCg0KKipVd2FnYSoqDQoNCklzdG5pZWrEhSBzdGFyZSB3ZXJzamUgZnVua2NqaSBwcnpla3N6dGHFgmNhasSFY3ljaCBkbyBwb3N0YWNpIHfEhXNraWVqIGkgc3plcmVva2llaiAgdyBwYWtpZWNpZSAqKnRpZHlyKiouDQoNCkZ1bmtjamEgKipnYXRoZXIqKi4NCmBgYHtyIExvbmdfZ2F0aGVyfQ0KQWlkXzAwLkxvbmcuZ2F0aGVyIDwtIEFpZF8wMCAlPiUgDQogIGdhdGhlcigNCiAgICBrZXkgPSAiWWVhciIsIA0KICAgIHZhbHVlID0gIkRvbGxhcnMiLCANCiAgICAtQ291bnRyeS5OYW1lLCAtUHJvZ3JhbS5OYW1lDQogICAgKSANCg0KQWlkXzAwLkxvbmcuZ2F0aGVyICU+JSBoZWFkDQpgYGANCg0KRnVua2NqYSAqKnNwcmVhZCoqLg0KYGBge3IgV2lkZXJfc3ByZWFkfQ0KQWlkXzAwLldpZGVyLnNwcmVhZCA8LSBBaWRfMDAuTG9uZy5nYXRoZXIgJT4lDQogIHNwcmVhZCgNCiAgICBrZXkgPSBZZWFyLCANCiAgICB2YWx1ZSA9IERvbGxhcnMNCiAgICApDQoNCkFpZF8wMC5XaWRlci5zcHJlYWQgJT4lIGhlYWQNCmBgYA0KDQojIyBGdW5rY2plIHogYmlibGlvdGVraSAqKnJlc2hhcGUyKioNCg0KTW/FvG5hIHRlxbwgdcW8eXdhxIcgZnVua2NqaTogKiptZWx0KiogKmkqICoqZGNhc3QqKiB6IGJpYmxpb3Rla2kgKipyZXNoYXBlMioqLg0KDQpQb2Rjenl0dWplbXkgYmlibGlvdGVrxJkgKipyZXNoYXBlMioqLg0KYGBge3IgcGFraWV0X3Jlc2hhcGUyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZXNoYXBlMikNCmBgYA0KDQpgYGB7ciBMb25nX21lbHQsIHdhcm5pbmcgPSBGQUxTRX0NCkFpZF8wMC5Mb25nLm1lbHQgPC0gQWlkXzAwICU+JSANCiAgbWVsdCgNCiAgICBpZC52YXJzID0gYygiQ291bnRyeS5OYW1lIiwgIlByb2dyYW0uTmFtZSIpLA0KICAgIHZhcmlhYmxlLm5hbWUgPSAiWWVhciIsIA0KICAgIHZhbHVlLm5hbWUgPSAiRG9sbGFycyIpDQoNCkFpZF8wMC5Mb25nLm1lbHQgJT4lIGhlYWQNCmBgYA0KDQpgYGB7ciBXaWRlcl9kY2FzdH0NCg0KQWlkXzAwLldpZGVyLmRjYXN0IDwtIEFpZF8wMC5Mb25nLm1lbHQgJT4lIA0KICBkY2FzdCgNCiAgICBDb3VudHJ5Lk5hbWUgKyBQcm9ncmFtLk5hbWUgfiBZZWFyLCANCiAgICB2YWx1ZS52YXIgPSAiRG9sbGFycyINCiAgICApDQoNCkFpZF8wMC5XaWRlci5kY2FzdCAlPiUgaGVhZA0KYGBgDQoNCk1vxbxlbXkgamUgb2dsxIVkxIVjIHogd3lrb3J6eXN0YW5pZW0gcGFraWV0dSAqKkRUKioNCg0KUG9kY3p5dHVqZW15IGJpYmxpb3Rla8SZICoqRFQqKi4NCmBgYHtyIHBha2l0X0RULCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShEVCkNCmBgYA0KDQpQb3N0YcSHIHfEhXNrYQ0KDQpgYGB7ciBwcmV6ZW50YWNqYV9pbnRlcmFrdHl3bmFfTG9uZ19waXZvdCwgd2FybmluZz1GQUxTRX0NCkFpZF8wMC5Mb25nLnBpdm90ICU+JSBkYXRhdGFibGUNCmBgYA0KDQpQb3N0YcSHIHN6ZXJva2ENCg0KYGBge3IgcHJlemVudGFjamFfaW50ZXJha3R5d25hX1dpZGVyX3Bpdm90LCB3YXJuaW5nPUZBTFNFfQ0KQWlkXzAwLldpZGVyLnBpdm90ICU+JSBkYXRhdGFibGUNCmBgYA0KTmEga29uaWVjIHVzdXdhbXkgemUgxZtyb2Rvd2lza2EgYmlibGlvdGVraS4NCmBgYHtyIHBha2lldHlfemFteWthbmllLCBpbmNsdWRlPUZBTFNFfQ0KZGV0YWNoKHBhY2thZ2U6dGlkeXIpDQpkZXRhY2gocGFja2FnZTpkcGx5cikNCmRldGFjaChwYWNrYWdlOnJlc2hhcGUyKQ0KZGV0YWNoKHBhY2thZ2U6RFQpDQpgYGANCiMgQmlibGlvZ3JhZmlhDQoNCjxkaXYgaWQ9InJlZnMiPjwvZGl2Pg0K