1 Zakład Bioinformatyki, Instytut Informatyki, Uniwersytet w Białymstoku

1 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

  1. R (zobacz [3]),
  2. bibliotek R (zobacz [4–7]),
  3. piszemy używając języka znaczników i biblioteki rmarkdown (zobacz [8, 9]) w RStudio z wykorzystaniem R Notebook.

Uwaga:

1.1 Czyścimy przestrzeń nazw (środowisko)

rm(list = ls())

1.2 Podczytujemy biblioteki dplyr i tidyr

1.3 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.

1.4 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

1.5 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

1.6 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

1.7 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.

2 Bibliografia

[1] Lander, J. P. (2018). R dla każdego. Zaawansowane analizy i grafika statystyczna. APN Promise, Warszawa.

[2] Lander, J. P. (2020). Data.

[3] R Core Team. (2019). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria.

[4] Wickham, H., François, R., Henry, L. and Müller, K. (2020). dplyr: A grammar of Data Manipulation.

[5] Wickham, H. and Henry, L. (2020). tidyr: Tidy Messy Data.

[6] Wickham, H. (2007). Reshaping Data with the reshape Package. Journal of Statistical Software 21 1–20.

[7] Xie, Y., Cheng, J. and Tan, X. (2020). DT: A Wrapper of the JavaScript Library ’DataTables’.

[8] Xie, Y., Allaire, J. J. and Grolemund, G. (2018). R Markdown: The Definitive Guide. Chapman; Hall/CRC, Boca Raton, Florida.

[9] Allaire, J., Xie, Y., McPherson, J., Luraschi, J., Ushey, K., Atkins, A., Wickham, H., Cheng, J., Chang, W. and Iannone, R. (2020). rmarkdown: Dynamic Documents for R.

LS0tDQp0aXRsZTogIlByYWNhIHogZGFueW1pIC0gY3rEmcWbxIcgZHJ1Z2EiDQphdXRob3I6IA0KICAtIEphcm9zxYJhdyBLb3Rvd2ljejoNCiAgICAgIGluc3RpdHV0ZTogDQogICAgICAgIC0gSUlVd0INCiAgICAgIGNvcnJlc3BvbmRlbmNlOiBmYWxzZQ0KICAgICAgZW1haWw6IGoua290b3dpY3pAdXdiLmVkdS5wbA0KZGF0ZTogIjQgbWFyY2EgMjAyMCINCmFsd2F5c19hbGxvd19odG1sOiB0cnVlDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGhpZ2hsaWdodDogdGFuZ28NCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHBhbmRvY19hcmdzOg0KICAgICAgLSAtLWx1YS1maWx0ZXI9c2Nob2xhcmx5LW1ldGFkYXRhLmx1YQ0KICAgICAgLSAtLWx1YS1maWx0ZXI9YXV0aG9yLWluZm8tYmxvY2tzLmx1YQ0KICAgIHRoZW1lOiBjb3Ntbw0KICAgIHRvYzogeWVzDQppbnN0aXR1dGU6IA0KICAtIElJVXdCOiBaYWvFgmFkIEJpb2luZm9ybWF0eWtpLCBJbnN0eXR1dCBJbmZvcm1hdHlraSwgVW5pd2Vyc3l0ZXQgdyBCaWHFgnltc3Rva3UNCmNzbDogdGhlLWFubmFscy1vZi1hcHBsaWVkLXByb2JhYmlsaXR5LmNzbA0KYmlibGlvZ3JhcGh5OiBJbmZFa28uYmliDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBQb3N0YcSHIHfEhXNrYSBpIHN6ZXJva2EgZGFueWNoIHogYmlibGlvdGVrYW1pICoqdGlkeXIqKiBpICoqcmVzaGFwZTIqKg0KDQpJbnNwaXJhY2rEhSBkbyBuYXBpc2FuaWEgdGVnbyAqbm90ZWJvb2thKiBqZXN0IHJvZHppYcWCIDE1LjMga3NpxIXFvGtpIEphcmVkYSBQLiBMYW5kZXJhICoiUiBkbGEga2HFvGRlZ28uIFphYXdhbnNvd2FuZSBhbmFsaXp5IGkgZ3JhZmlrYSBzdGF0eXN0eWN6bmEiKiAoem9iYWN6IFtAbGFuZGVyX1JkS10pLiBEYW5lIHd5a29yenlzdGFuZSBwb2Nob2R6xIUgcsOzd25pZcW8IHplIHN0cm9ueSBKYXJlZGEgUC4gTGFuZGVyYSAoem9iYWN6IFtAd2Vic2l0ZV9sYW5kZXJfUmRLXSkuDQoNCktvcnp5c3RhbXkgeiANCg0KMS4gUiAoem9iYWN6IFtAbGFuZ3VhZ2VfUl0pLA0KMi4gYmlibGlvdGVrIFIgKHpvYmFjeiBbQHBhY2thZ2VfZHBseXI7IEBwYWNrYWdlX3RpZHlyOyBAcGFja2FnZV9yZXNoYXBlMjsgQHBhY2thZ2VfRFRdKSwNCjMuIHBpc3plbXkgdcW8eXdhasSFYyBqxJl6eWthIHpuYWN6bmlrw7N3IGkgYmlibGlvdGVraSAqKnJtYXJrZG93bioqICh6b2JhY3ogW0Bib29rX3JtYXJrZG93bjsgQHBhY2thZ2Vfcm1hcmtkb3duXSkgdyAqKlJTdHVkaW8qKiB6IHd5a29yenlzdGFuaWVtICoqUiBOb3RlYm9vayoqLg0KDQpVd2FnYToNCg0KKiBLb2QgcG9kY3p5dGFuaWUgYmlibGlvdGVrIGplc3QgdWtyeXR5Lg0KDQojIyBDennFm2NpbXkgcHJ6ZXN0cnplxYQgbmF6dyAoxZtyb2Rvd2lza28pDQoNCmBgYHtyIGN6eXN6Y3plbmllX2RhbnljaH0NCnJtKGxpc3QgPSBscygpKQ0KYGBgDQoNCiMjIFBvZGN6eXR1amVteSBiaWJsaW90ZWtpICoqZHBseXIqKiBpICoqdGlkeXIqKg0KDQpgYGB7ciBwYWtpZXR5LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmxpYnJhcnkodGlkeXIpDQpgYGANCg0KIyMgV2N6eXRhbmllIGRhbnljaA0KDQpXY3p5dHVqZW15IGRhbmUgaSBvZ2zEhWRhbXkgKHphcGlzYW5lIHPEhSB3IHBsaWt1ICoqQWlkXzAwLlJEYXRhKiopLg0KYGBge3IgbG9hZF9BaWRfMDB9DQpsb2FkKCJBaWRfMDAuUkRhdGEiKQ0KDQpBaWRfMDAgJT4lIGhlYWQNCmBgYA0KDQpEYW5lIHPEhSB3IHBvc3RhY2kgc3plcm9raWVqLg0KDQojIyBQcnpla3N6dGHFgmNlbmllIGRvIHBvc3RhY2kgKnfEhXNraWVqKg0KDQpQcnpla3N6dGHFgmNpbXkgamUgZG8gcG9zdGFjaSAqd8SFc2tpZWoqIChmdW5rY2phICoqcGl2b3RfbG9uZ2VyKiopIHogZHJvYm55bSB1cG9yesSFZGtvd2FuaWVtIChmdW5rY2phICoqYXJyYW5nZSoqKS4NCmBgYHtyIGxvbmdfcGl2b3R9DQpBaWRfMDAuTG9uZy5waXZvdCA8LSBBaWRfMDAgJT4lDQogIHBpdm90X2xvbmdlcigNCiAgICAtYyhDb3VudHJ5Lk5hbWUsIFByb2dyYW0uTmFtZSksDQogICAgbmFtZXNfdG8gPSAiWWVhciIsDQogICAgdmFsdWVzX3RvID0gIkRvbGxhcnMiDQogICkgJT4lDQogIGFycmFuZ2UoQ291bnRyeS5OYW1lLCBZZWFyKQ0KYGBgDQoNCk9iZWpyenlteSBwaWVyd3N6ZSB3aWVyc3plLg0KYGBge3IgbG9uZ19waXZvdF8wMX0NCkFpZF8wMC5Mb25nLnBpdm90ICU+JSBoZWFkDQpgYGANCg0KIyMgUHJ6ZWtzenRhxYJjZW5pZSBkbyBwb3N0YWNpICpzemVyb2tpZWoqDQoNCkkgeiBwb3dyb3RlbSBkbyBwb3N0YWNpICpzemVyb2tpZWoqIHd5a29yenlzdHVqxIVjIGZ1bmtjasSZICoqcGl2b3Rfd2lkZXIqKi4NCmBgYHtyIFdpZGVyX3Bpdm90fQ0KQWlkXzAwLldpZGVyLnBpdm90IDwtIEFpZF8wMC5Mb25nLnBpdm90ICU+JQ0KICBwaXZvdF93aWRlcigNCiAgICBuYW1lc19mcm9tID0gWWVhciwNCiAgICB2YWx1ZXNfZnJvbSA9IERvbGxhcnMNCiAgKSAlPiUNCiAgYXJyYW5nZShDb3VudHJ5Lk5hbWUsIFByb2dyYW0uTmFtZSkNCmBgYA0KDQpJIHpub3d1IG9nbMSFZGFteS4NCmBgYHtyIFdpZGVyX3Bpdm90XzAxfQ0KQWlkXzAwLldpZGVyLnBpdm90ICU+JSBoZWFkDQpgYGANCg0KDQojIyBTdGFyZSB3ZXJzamUgZnVua2NqaSBwcnpla3N6dGHFgmNhasSFY3ljaCBkbyBwb3N0YWNpIHfEhXNraWVqIGkgc3plcm9raWVqIHcgYmlibGlvdGVjZSAqKnRpZHlyKioNCg0KKipVd2FnYSoqDQoNCklzdG5pZWrEhSBzdGFyZSB3ZXJzamUgZnVua2NqaSBwcnpla3N6dGHFgmNhasSFY3ljaCBkbyBwb3N0YWNpIHfEhXNraWVqIGkgc3plcmVva2llaiAgdyBwYWtpZWNpZSAqKnRpZHlyKiouDQoNCkZ1bmtjamEgKipnYXRoZXIqKi4NCmBgYHtyIExvbmdfZ2F0aGVyfQ0KQWlkXzAwLkxvbmcuZ2F0aGVyIDwtIEFpZF8wMCAlPiUgDQogIGdhdGhlcigNCiAgICBrZXkgPSAiWWVhciIsIA0KICAgIHZhbHVlID0gIkRvbGxhcnMiLCANCiAgICAtQ291bnRyeS5OYW1lLCAtUHJvZ3JhbS5OYW1lDQogICAgKSANCg0KQWlkXzAwLkxvbmcuZ2F0aGVyICU+JSBoZWFkDQpgYGANCg0KRnVua2NqYSAqKnNwcmVhZCoqLg0KYGBge3IgV2lkZXJfc3ByZWFkfQ0KQWlkXzAwLldpZGVyLnNwcmVhZCA8LSBBaWRfMDAuTG9uZy5nYXRoZXIgJT4lDQogIHNwcmVhZCgNCiAgICBrZXkgPSBZZWFyLCANCiAgICB2YWx1ZSA9IERvbGxhcnMNCiAgICApDQoNCkFpZF8wMC5XaWRlci5zcHJlYWQgJT4lIGhlYWQNCmBgYA0KDQojIyBGdW5rY2plIHogYmlibGlvdGVraSAqKnJlc2hhcGUyKioNCg0KTW/FvG5hIHRlxbwgdcW8eXdhxIcgZnVua2NqaTogKiptZWx0KiogKmkqICoqZGNhc3QqKiB6IGJpYmxpb3Rla2kgKipyZXNoYXBlMioqLg0KDQpQb2Rjenl0dWplbXkgYmlibGlvdGVrxJkgKipyZXNoYXBlMioqLg0KYGBge3IgcGFraWV0X3Jlc2hhcGUyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShyZXNoYXBlMikNCmBgYA0KDQpgYGB7ciBMb25nX21lbHQsIHdhcm5pbmcgPSBGQUxTRX0NCkFpZF8wMC5Mb25nLm1lbHQgPC0gQWlkXzAwICU+JSANCiAgbWVsdCgNCiAgICBpZC52YXJzID0gYygiQ291bnRyeS5OYW1lIiwgIlByb2dyYW0uTmFtZSIpLA0KICAgIHZhcmlhYmxlLm5hbWUgPSAiWWVhciIsIA0KICAgIHZhbHVlLm5hbWUgPSAiRG9sbGFycyIpDQoNCkFpZF8wMC5Mb25nLm1lbHQgJT4lIGhlYWQNCmBgYA0KDQpgYGB7ciBXaWRlcl9kY2FzdH0NCg0KQWlkXzAwLldpZGVyLmRjYXN0IDwtIEFpZF8wMC5Mb25nLm1lbHQgJT4lIA0KICBkY2FzdCgNCiAgICBDb3VudHJ5Lk5hbWUgKyBQcm9ncmFtLk5hbWUgfiBZZWFyLCANCiAgICB2YWx1ZS52YXIgPSAiRG9sbGFycyINCiAgICApDQoNCkFpZF8wMC5XaWRlci5kY2FzdCAlPiUgaGVhZA0KYGBgDQoNCk1vxbxlbXkgamUgb2dsxIVkxIVjIHogd3lrb3J6eXN0YW5pZW0gcGFraWV0dSAqKkRUKioNCg0KUG9kY3p5dHVqZW15IGJpYmxpb3Rla8SZICoqRFQqKi4NCmBgYHtyIHBha2l0X0RULCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQ0KbGlicmFyeShEVCkNCmBgYA0KDQpQb3N0YcSHIHfEhXNrYQ0KDQpgYGB7ciBwcmV6ZW50YWNqYV9pbnRlcmFrdHl3bmFfTG9uZ19waXZvdCwgd2FybmluZz1GQUxTRX0NCkFpZF8wMC5Mb25nLnBpdm90ICU+JSBkYXRhdGFibGUNCmBgYA0KDQpQb3N0YcSHIHN6ZXJva2ENCg0KYGBge3IgcHJlemVudGFjamFfaW50ZXJha3R5d25hX1dpZGVyX3Bpdm90LCB3YXJuaW5nPUZBTFNFfQ0KQWlkXzAwLldpZGVyLnBpdm90ICU+JSBkYXRhdGFibGUNCmBgYA0KTmEga29uaWVjIHVzdXdhbXkgemUgxZtyb2Rvd2lza2EgYmlibGlvdGVraS4NCmBgYHtyIHBha2lldHlfemFteWthbmllLCBpbmNsdWRlPUZBTFNFfQ0KZGV0YWNoKHBhY2thZ2U6dGlkeXIpDQpkZXRhY2gocGFja2FnZTpkcGx5cikNCmRldGFjaChwYWNrYWdlOnJlc2hhcGUyKQ0KZGV0YWNoKHBhY2thZ2U6RFQpDQpgYGANCiMgQmlibGlvZ3JhZmlhDQoNCjxkaXYgaWQ9InJlZnMiPjwvZGl2Pg0K