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

1 Praca z danymi - kształtowanie danych

Podstawą i inspiracją do napisania tego notebooka jest rodział 14.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.

1.1 Ściągnięcie danych z Internetu

Zaczynamy od wyczyszczenia środowiska ze zmiennych

rm(list = ls())

Importujemy dane w postaci pliku zip poleceniem download.file i następnie rozpakowujemy archiwum poeceniem uzip.

download.file(url = "http://jaredlander.com/data/US_Foreign_Aid.zip", 
              destfile = "ForeignAid.zip")
trying URL 'http://jaredlander.com/data/US_Foreign_Aid.zip'
Content type 'application/zip' length 226642 bytes (221 KB)
downloaded 221 KB
unzip("ForeignAid.zip")

Zapisujemy nazwy plików z rozszerzeniem csv do wektora poleceniem dir.

theFiles <- dir(pattern = "\\.csv")
theFiles
[1] "US_Foreign_Aid_00s.csv" "US_Foreign_Aid_10s.csv" "US_Foreign_Aid_40s.csv"
[4] "US_Foreign_Aid_50s.csv" "US_Foreign_Aid_60s.csv" "US_Foreign_Aid_70s.csv"
[7] "US_Foreign_Aid_80s.csv" "US_Foreign_Aid_90s.csv"

1.2 Przypisanie zmiennym danych

Wczytujemy bibliotekę stringr w celu pracy z napisami.

library(stringr)

Pętlą for iterując po nazwach pliku tworzymy

  1. nazwę zmiennych (zbiorów danych) wykorzystając nazwy plików (litery od 12 do 18) poleceniem str_sub z bibiloteki stringr,
  2. podczytujemy dane z plików o rozszerzeniu csv poleceniem read.table,
  3. przypisujemy nazwom zmiennych podczytane dane poleceniem assign.
for (a in theFiles) {
  nameToUse <- str_sub(string = a, start = 12, end = 18)
  temp <- read.table(file = a, header = TRUE, sep = ",", stringsAsFactors = FALSE)
  assign(x = nameToUse, value = temp)
}

1.3 Trochę przekształcenia

Wczytujemy bibliotekę dyplyr do pracy z danymi (w tym do przetwarzania potokowego - operator pipe - %>%).

Uwaga. Używamy opcji wstawek chunk do nie wyświetlania ostrzeżeń i informacji.

library(dplyr)

Wczytujemy bibliotekę reshape2 do przekształacania danych (postacie wąska i szeroka).

library(reshape2)

Funkcją melt przekształcamy dane z postaci szerokiej do wąskiej.

melt00 <- melt(Aid_00s, 
               id.vars = c("Country.Name", "Program.Name"),
               variable.name = "Year", 
               value.name = "Dollars")

Funkcją head oglądamy początkowe wiersze danych (6 wierszy).

melt00 %>% head

Z wartości zmiennej Year zostawiamy tylko same cyfry, zamieniając napis na liczbę poleceniami str_extract z bibilioteki stringr i as.numeric wykorzystując wyrażenia regularne (polecenie \d+). Przy okazji zmienia się typ kolumny. Nadpisujemy kolumnę Year używając operatora odwołania do kolumny $ i przypisania <-.

melt00$Year <- as.numeric(str_extract(string = melt00$Year, pattern = "\\d+"))

I znowu oglądamy początkowe wiersze danych.

melt00 %>% head

Zapisujemy wszystkie dane z przestrzeni nazw (środowiska) poleceniem save.

save(list = ls(), file = "Aid.RData")

1.4 Prezentacja danych interaktywnie

Ponieważ polecenie head wyświetla tylko kilka początkowych wierszy danych (domyślnie 6) nie jest możliwe oglądanie wszystkich dany w przeglądarce (plik html).

Można temu zapobiec wykorzystując bibliotekę DT.

1.4.1 Dane w postaci wąskiej (długiej)

Wczytujemy bibilotekę DT.

library(DT)

Możemy w końcu oglądać wszystkie dane na stronie internetowej (budowa tablicy interaktywnej poleceniem datatable).

melt00 %>% datatable

1.4.2 Dane do postaci szerokiej i ich prezentacja

Poleceniem dcast z biblioteki Reshape2 formatujemy dane z postaci wąskiej do postaci szerokiej.

Aid_00 <- dcast(
  melt00, 
  Country.Name + Program.Name ~ Year, 
  value.var = "Dollars"
)

Oglądamy początkowe wiersze danych.

Aid_00 %>% head

Do dalszego wykorzystania zapisujemy dane ze zbioru Aid_00 do pliku binarnego Aid_00.RData.

save(Aid_00, file = "Aid_00.RData")

I jeszcze raz tablica interaktywna z danymi w postaci szerokiej.

Aid_00 %>% datatable

Na koniec usuwamy ze środowiska funkcje z użytywanych bibliotek poleceniem detach.

detach(package:stringr)
detach(package:dplyr)
detach(package:reshape2)
detach(package:DT)

2 Bibliografia

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

2. Lander JP (2020) Data.

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

4. Wickham H (2019) stringr: Simple, Consistent Wrappers for Common String Operations.

5. Wickham H, François R, Henry L, et al. (2020) dplyr: A grammar of Data Manipulation.

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

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

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

9. Allaire J, Xie Y, McPherson J, et al. (2020) rmarkdown: Dynamic Documents for R.

LS0tDQp0aXRsZTogIlByYWNhIHogZGFueW1pIC0gY3rEmcWbxIcgcGllcndzemEiDQphdXRob3I6IA0KICAtIEphcm9zxYJhdyBLb3Rvd2ljejoNCiAgICAgIGluc3RpdHV0ZTogDQogICAgICAgIC0gSUlVd0INCiAgICAgIGNvcnJlc3BvbmRlbmNlOiBmYWxzZQ0KICAgICAgZW1haWw6IGoua290b3dpY3pAdXdiLmVkdS5wbA0KZGF0ZTogIjQgbWFyY2EgMjAyMCINCmFsd2F5c19hbGxvd19odG1sOiB0cnVlDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgZmlnX2NhcHRpb246IHllcw0KICAgIGhpZ2hsaWdodDogcHlnbWVudHMNCiAgICBudW1iZXJfc2VjdGlvbnM6IHllcw0KICAgIHBhbmRvY19hcmdzOg0KICAgICAgLSAtLWx1YS1maWx0ZXI9c2Nob2xhcmx5LW1ldGFkYXRhLmx1YQ0KICAgICAgLSAtLWx1YS1maWx0ZXI9YXV0aG9yLWluZm8tYmxvY2tzLmx1YQ0KICAgIHRoZW1lOiBjZXJ1bGVhbg0KICAgIHRvYzogeWVzDQppbnN0aXR1dGU6IA0KICAtIElJVXdCOiBaYWvFgmFkIEJpb2luZm9ybWF0eWtpLCBJbnN0eXR1dCBJbmZvcm1hdHlraSwgVW5pd2Vyc3l0ZXQgdyBCaWHFgnltc3Rva3UNCmNzbDogYmlnLWRhdGEtYW5kLWluZm9ybWF0aW9uLWFuYWx5dGljcy5jc2wNCmJpYmxpb2dyYXBoeTogSW5mRWtvLmJpYg0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgUHJhY2EgeiBkYW55bWkgLSBrc3p0YcWCdG93YW5pZSBkYW55Y2gNCg0KUG9kc3Rhd8SFIGkgaW5zcGlyYWNqxIUgZG8gbmFwaXNhbmlhIHRlZ28gKm5vdGVib29rYSogamVzdCByb2R6aWHFgiAxNC4zIGtzacSFxbxraSBKYXJlZGEgUC4gTGFuZGVyYSAqIlIgZGxhIGthxbxkZWdvLiBaYWF3YW5zb3dhbmUgYW5hbGl6eSBpIGdyYWZpa2Egc3RhdHlzdHljem5hIiogKHpvYmFjeiBbQGxhbmRlcl9SZEtdKS4gRGFuZSB3eWtvcnp5c3RhbmUgcG9jaG9kesSFIHLDs3duaWXFvCB6ZSBzdHJvbnkgSmFyZWRhIFAuIExhbmRlcmEgKHpvYmFjeiBbQHdlYnNpdGVfbGFuZGVyX1JkS10pLg0KDQpLb3J6eXN0YW15IHogDQoNCjEuIFIgKHpvYmFjeiBbQGxhbmd1YWdlX1JdKSwNCjIuIGJpYmxpb3RlayBSICh6b2JhY3ogW0BwYWNrYWdlX3N0cmluZ3I7IEBwYWNrYWdlX2RwbHlyOyBAcGFja2FnZV9yZXNoYXBlMjsgQHBhY2thZ2VfRFRdKSwNCjMuIHBpc3plbXkgdcW8eXdhasSFYyBqxJl6eWthIHpuYWN6bmlrw7N3IGkgYmlibGlvdGVraSAqKnJtYXJrZG93bioqICh6b2JhY3ogW0Bib29rX3JtYXJrZG93bjsgQHBhY2thZ2Vfcm1hcmtkb3duXSkgdyAqKlJTdHVkaW8qKiB6IHd5a29yenlzdGFuaWVtICoqUiBOb3RlYm9vayoqLg0KDQojIyDFmmNpxIVnbmnEmWNpZSBkYW55Y2ggeiAqSW50ZXJuZXR1Kg0KDQpaYWN6eW5hbXkgb2Qgd3ljenlzemN6ZW5pYSDFm3JvZG93aXNrYSB6ZSB6bWllbm55Y2gNCg0KYGBge3IgY3p5c3pjemVuaWVfZGFueWNofQ0Kcm0obGlzdCA9IGxzKCkpDQpgYGANCg0KSW1wb3J0dWplbXkgZGFuZSB3IHBvc3RhY2kgcGxpa3UgKnppcCogcG9sZWNlbmllbSAqKmRvd25sb2FkLmZpbGUqKiBpIG5hc3TEmXBuaWUgcm96cGFrb3d1amVteSBhcmNoaXd1bSAgcG9lY2VuaWVtICoqdXppcCoqLg0KYGBge3IgcGxpa19KTF9VU19Gb3JlaWduX0FpZH0NCmRvd25sb2FkLmZpbGUodXJsID0gImh0dHA6Ly9qYXJlZGxhbmRlci5jb20vZGF0YS9VU19Gb3JlaWduX0FpZC56aXAiLCANCiAgICAgICAgICAgICAgZGVzdGZpbGUgPSAiRm9yZWlnbkFpZC56aXAiKQ0KdW56aXAoIkZvcmVpZ25BaWQuemlwIikNCmBgYA0KDQpaYXBpc3VqZW15IG5hend5IHBsaWvDs3cgeiByb3pzemVyemVuaWVtICpjc3YqIGRvIHdla3RvcmEgcG9sZWNlbmllbSAqKmRpcioqLg0KDQpgYGB7ciBsaXN0YV9wbGlrb3d9DQp0aGVGaWxlcyA8LSBkaXIocGF0dGVybiA9ICJcXC5jc3YiKQ0KdGhlRmlsZXMNCmBgYA0KDQojIyBQcnp5cGlzYW5pZSB6bWllbm55bSBkYW55Y2gNCg0KV2N6eXR1amVteSBiaWJsaW90ZWvEmSAqKnN0cmluZ3IqKiB3IGNlbHUgcHJhY3kgeiBuYXBpc2FtaS4NCg0KYGBge3IgY2h1bmtfcGFraWV0X3N0cmluZ3J9DQpsaWJyYXJ5KHN0cmluZ3IpDQpgYGANCg0KUMSZdGzEhSAqKmZvcioqIGl0ZXJ1asSFYyBwbyBuYXp3YWNoIHBsaWt1IHR3b3J6eW15DQoNCjEuIG5henfEmSB6bWllbm55Y2ggKHpiaW9yw7N3IGRhbnljaCkgd3lrb3J6eXN0YWrEhWMgbmF6d3kgcGxpa8OzdyAobGl0ZXJ5IG9kIDEyIGRvIDE4KSBwb2xlY2VuaWVtICoqc3RyX3N1YioqIHogYmliaWxvdGVraSAqKnN0cmluZ3IqKiwNCjIuIHBvZGN6eXR1amVteSBkYW5lIHogcGxpa8OzdyBvIHJvenN6ZXJ6ZW5pdSAqY3N2KiBwb2xlY2VuaWVtICoqcmVhZC50YWJsZSoqLA0KMy4gcHJ6eXBpc3VqZW15IG5hendvbSB6bWllbm55Y2ggcG9kY3p5dGFuZSBkYW5lIHBvbGVjZW5pZW0gKiphc3NpZ24qKi4NCg0KYGBge3Igb2Rjenl0YW5pZV9kYW55Y2h9DQpmb3IgKGEgaW4gdGhlRmlsZXMpIHsNCiAgbmFtZVRvVXNlIDwtIHN0cl9zdWIoc3RyaW5nID0gYSwgc3RhcnQgPSAxMiwgZW5kID0gMTgpDQogIHRlbXAgPC0gcmVhZC50YWJsZShmaWxlID0gYSwgaGVhZGVyID0gVFJVRSwgc2VwID0gIiwiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQogIGFzc2lnbih4ID0gbmFtZVRvVXNlLCB2YWx1ZSA9IHRlbXApDQp9DQpgYGANCg0KIyMgVHJvY2jEmSBwcnpla3N6dGHFgmNlbmlhDQoNCldjenl0dWplbXkgYmlibGlvdGVrxJkgKipkeXBseXIqKiBkbyBwcmFjeSB6IGRhbnltaSAodyB0eW0gZG8gcHJ6ZXR3YXJ6YW5pYSBwb3Rva293ZWdvIC0gb3BlcmF0b3IgKipwaXBlKiogLSAqJT4lKikuDQoNCipVd2FnYSouIFXFvHl3YW15IG9wY2ppIHdzdGF3ZWsgKipjaHVuayoqIGRvIG5pZSB3ecWbd2lldGxhbmlhIG9zdHJ6ZcW8ZcWEIGkgaW5mb3JtYWNqaS4NCg0KYGBge3IgcGFraWV0X2RwbHlyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQ0KbGlicmFyeShkcGx5cikNCmBgYA0KDQpXY3p5dHVqZW15IGJpYmxpb3Rla8SZICoqcmVzaGFwZTIqKiBkbyBwcnpla3N6dGHFgmFjYW5pYSBkYW55Y2ggKHBvc3RhY2llICp3xIVza2EqIGkgKnN6ZXJva2EqKS4NCg0KYGBge3IgcGFraWV0X3Jlc2hhcGUyfQ0KbGlicmFyeShyZXNoYXBlMikNCmBgYA0KDQpGdW5rY2rEhSAqKm1lbHQqKiBwcnpla3N6dGHFgmNhbXkgZGFuZSB6IHBvc3RhY2kgKnN6ZXJva2llaiogZG8gKnfEhXNraWVqKi4NCg0KYGBge3IgZnVua2NqYV9tZWx0fQ0KbWVsdDAwIDwtIG1lbHQoQWlkXzAwcywgDQogICAgICAgICAgICAgICBpZC52YXJzID0gYygiQ291bnRyeS5OYW1lIiwgIlByb2dyYW0uTmFtZSIpLA0KICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9ICJZZWFyIiwgDQogICAgICAgICAgICAgICB2YWx1ZS5uYW1lID0gIkRvbGxhcnMiKQ0KYGBgDQoNCkZ1bmtjasSFICoqaGVhZCoqIG9nbMSFZGFteSBwb2N6xIV0a293ZSB3aWVyc3plIGRhbnljaCAoKjYgd2llcnN6eSopLg0KDQpgYGB7ciBmdW5rY2phX2hlYWR9DQptZWx0MDAgJT4lIGhlYWQNCmBgYA0KDQpaIHdhcnRvxZtjaSB6bWllbm5laiAqKlllYXIqKiB6b3N0YXdpYW15IHR5bGtvIHNhbWUgY3lmcnksIHphbWllbmlhasSFYyBuYXBpcyBuYSBsaWN6YsSZIHBvbGVjZW5pYW1pDQoqKnN0cl9leHRyYWN0KiogeiBiaWJpbGlvdGVraSAqKnN0cmluZ3IqKiBpICoqYXMubnVtZXJpYyoqIHd5a29yenlzdHVqxIVjIHd5cmHFvGVuaWEgcmVndWxhcm5lIChwb2xlY2VuaWUgKipcXGQrKiopLiBQcnp5IG9rYXpqaSB6bWllbmlhIHNpxJkgdHlwIGtvbHVtbnkuIE5hZHBpc3VqZW15IGtvbHVtbsSZICoqWWVhcioqIHXFvHl3YWrEhWMgb3BlcmF0b3JhIG9kd2/FgmFuaWEgZG8ga29sdW1ueSAqKiQqKiBpIHByenlwaXNhbmlhICoqPC0qKi4NCmBgYHtyIHllYXJfYXNfbnVtYmVyfQ0KbWVsdDAwJFllYXIgPC0gYXMubnVtZXJpYyhzdHJfZXh0cmFjdChzdHJpbmcgPSBtZWx0MDAkWWVhciwgcGF0dGVybiA9ICJcXGQrIikpDQpgYGANCkkgem5vd3Ugb2dsxIVkYW15IHBvY3rEhXRrb3dlIHdpZXJzemUgZGFueWNoLg0KYGBge3IgZnVua2NqYV9oZWFkXzAyfQ0KbWVsdDAwICU+JSBoZWFkDQpgYGANClphcGlzdWplbXkgd3N6eXN0a2llIGRhbmUgeiBwcnplc3RyemVuaSBuYXp3ICjFm3JvZG93aXNrYSkgcG9sZWNlbmllbSAqKnNhdmUqKi4NCmBgYHtyIHNhdmVfQWlkfQ0Kc2F2ZShsaXN0ID0gbHMoKSwgZmlsZSA9ICJBaWQuUkRhdGEiKQ0KYGBgDQoNCiMjIFByZXplbnRhY2phIGRhbnljaCBpbnRlcmFrdHl3bmllDQoNClBvbmlld2HFvCBwb2xlY2VuaWUgKipoZWFkKiogd3nFm3dpZXRsYSB0eWxrbyBraWxrYSBwb2N6xIV0a293eWNoIHdpZXJzenkgZGFueWNoIChkb215xZtsbmllIDYpIG5pZSBqZXN0IG1vxbxsaXdlIG9nbMSFZGFuaWUgd3N6eXN0a2ljaCBkYW55IHcgcHJ6ZWdsxIVkYXJjZSAocGxpayAqKmh0bWwqKikuDQoNCk1vxbxuYSB0ZW11IHphcG9iaWVjIHd5a29yenlzdHVqxIVjIGJpYmxpb3Rla8SZICoqRFQqKi4NCg0KIyMjIERhbmUgdyBwb3N0YWNpIHfEhXNraWVqIChkxYJ1Z2llaikNCg0KV2N6eXR1amVteSBiaWJpbG90ZWvEmSAqKkRUKiouDQpgYGB7ciBwYWtpZXRfRFQsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpsaWJyYXJ5KERUKQ0KYGBgDQpNb8W8ZW15IHcga2/FhGN1IG9nbMSFZGHEhyB3c3p5c3RraWUgZGFuZSBuYSBzdHJvbmllIGludGVybmV0b3dlaiAoYnVkb3dhIHRhYmxpY3kgaW50ZXJha3R5d25laiBwb2xlY2VuaWVtICoqZGF0YXRhYmxlKiopLg0KYGBge3IgdGFibGljYV9pbnRlcmFrdHl3bmFfbWVsdCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCm1lbHQwMCAlPiUgZGF0YXRhYmxlDQpgYGANCg0KIyMjIERhbmUgZG8gcG9zdGFjaSBzemVyb2tpZWogaSBpY2ggcHJlemVudGFjamENCg0KUG9sZWNlbmllbSAqKmRjYXN0KiogeiBiaWJsaW90ZWtpICoqUmVzaGFwZTIqKiBmb3JtYXR1amVteSBkYW5lIHogcG9zdGFjaSAqd8SFc2tpZWoqIGRvIHBvc3RhY2kgKnN6ZXJva2llaiouDQpgYGB7ciBmdW5jamFfZGNhc3R9DQpBaWRfMDAgPC0gZGNhc3QoDQogIG1lbHQwMCwgDQogIENvdW50cnkuTmFtZSArIFByb2dyYW0uTmFtZSB+IFllYXIsIA0KICB2YWx1ZS52YXIgPSAiRG9sbGFycyINCikNCmBgYA0KDQpPZ2zEhWRhbXkgcG9jesSFdGtvd2Ugd2llcnN6ZSBkYW55Y2guDQpgYGB7ciBmdW5jamFfaGVhZF8wM30NCkFpZF8wMCAlPiUgaGVhZA0KYGBgDQoNCkRvIGRhbHN6ZWdvIHd5a29yenlzdGFuaWEgemFwaXN1amVteSBkYW5lIHplIHpiaW9ydSAqKkFpZF8wMCoqIGRvIHBsaWt1IGJpbmFybmVnbyAqKkFpZF8wMC5SRGF0YSoqLg0KYGBge3Igc2F2ZV9BaWRfMDAsIHdhcm5pbmc9RkFMU0V9DQpzYXZlKEFpZF8wMCwgZmlsZSA9ICJBaWRfMDAuUkRhdGEiKQ0KYGBgDQoNCkkgamVzemN6ZSByYXogdGFibGljYSBpbnRlcmFrdHl3bmEgeiBkYW55bWkgdyBwb3N0YWNpICpzemVyb2tpZWoqLg0KYGBge3IgdGFibGljYV9pbnRlcmFrdHl3bmFfZGNhc3R9DQpBaWRfMDAgJT4lIGRhdGF0YWJsZQ0KYGBgDQpOYSBrb25pZWMgdXN1d2FteSB6ZSDFm3JvZG93aXNrYSBmdW5rY2plIHogdcW8eXR5d2FueWNoIGJpYmxpb3RlayBwb2xlY2VuaWVtICoqZGV0YWNoKiouIA0KYGBge3IgcGFraWV0eV96YW15a2FuaWV9DQpkZXRhY2gocGFja2FnZTpzdHJpbmdyKQ0KZGV0YWNoKHBhY2thZ2U6ZHBseXIpDQpkZXRhY2gocGFja2FnZTpyZXNoYXBlMikNCmRldGFjaChwYWNrYWdlOkRUKQ0KYGBgDQoNCiMgQmlibGlvZ3JhZmlhDQoNCjxkaXYgaWQ9InJlZnMiPjwvZGl2Pg==