TidyR – uporządkuj swoje dane
Dzisiaj zapoznamy Was z podstawowymi funkcjami biblioteki TidyR, która służy do zmiany kształtu i hierarchi zbioru danych. Zaczniemy jak zawsze od załadowania biblioteki:
1 |
library(tidyr) |
Do naszego przykładu użyjemy danych, które sami sobie wygenerujemy. Weźmy np. liczbę mężczyzn i kobiet w regionach A i B w dwóch latach 2020 i 2021. Do utworzenia tabeli z takimi danymi wykorzystamy funkcję tibble:
1 2 3 4 |
dt = tibble(region = c("A","A","B","B"), gender = c("m","f","m","f"), "2020" = sample(1:1000,4), "2021" = sample(1:1000,4)) |
Nasze dane wyglądają następująco:
1 2 3 4 5 6 7 8 |
dt # A tibble: 4 x 4 region gender `2020` `2021` <chr> <chr> <int> <int> 1 A m 802 668 2 A f 944 602 3 B m 503 940 4 B f 543 45 |
Pierwsza funkcja jaką poznamy to gather, która zamienia kolumny w rzędy:
1 |
g = gather(data = dt, '2020', '2021', key = 'year', value = 'count') |
Funkcja ta nasze dwie kolumny 2020 i 2021 zamienia na jedną kolumnę o nazwie count i dodatkowo dodaje kolumnę year zawierającą nazwy pierwotnych kolumn:
1 2 3 4 5 6 7 8 9 10 11 12 |
g # A tibble: 8 x 4 region gender year count <chr> <chr> <chr> <int> 1 A m 2020 802 2 A f 2020 944 3 B m 2020 503 4 B f 2020 543 5 A m 2021 668 6 A f 2021 602 7 B m 2021 940 8 B f 2021 45 |
Funcja spread zamienia natomiast wiersze na kolumny. My rozdzielimy nasze dane z tabeli g po płci:
1 |
s = spread(g,gender,count) |
1 2 3 4 5 6 7 8 |
s # A tibble: 4 x 4 region year f m <chr> <chr> <int> <int> 1 A 2020 944 802 2 A 2021 602 668 3 B 2020 543 503 4 B 2021 45 940 |
TidyR ma dodatkowo przydatne funkcje do czyszczenia naszych zbiorów z braku danych NA. Dodajmy sobie do naszej tabeli dt brak danych:
1 |
dt[3,3] = NA |
1 2 3 4 5 6 7 8 |
dt # A tibble: 4 x 4 region gender `2020` `2021` <chr> <chr> <int> <int> 1 A m 802 668 2 A f 944 602 3 B m NA 940 4 B f 543 45 |
Funkcja drop_na usuwa z naszej ramki danych wiersze z brakami:
1 |
drop_na(dt) |
Wiersz z brakiem danych został usunięty:
1 2 3 4 5 6 |
# A tibble: 3 x 4 region gender `2020` `2021` <chr> <chr> <int> <int> 1 A m 802 668 2 A f 944 602 3 B f 543 45 |
Funkcja fill uzupełnia brak danych wartościami z góry lub z dołu w danej kolumnie:
1 |
fill(data = dt,'2020',.direction = "up") |
Brakująca wartość została dodana z dolnego wiersza:
1 2 3 4 5 6 7 |
# A tibble: 4 x 4 region gender `2020` `2021` <chr> <chr> <int> <int> 1 A m 802 668 2 A f 944 602 3 B m 543 940 4 B f 543 45 |
Replace_na służy do zastąpienia braku wartości daną zdefiniowaną przez użytkownika:
1 |
replace_na(dt,list('2020'=0)) |
1 2 3 4 5 6 7 |
# A tibble: 4 x 4 region gender `2020` `2021` <chr> <chr> <dbl> <int> 1 A m 802 668 2 A f 944 602 3 B m 0 940 4 B f 543 45 |
A co w przypadku, gdy nasze dane w jednej kolumnie zostały zapisane jako ciąg liczb przedzielony separatorem:
1 2 3 4 5 6 7 |
# A tibble: 4 x 3 region gender count <chr> <chr> <chr> 1 A m 24;34 2 A f 719;508 3 B m 819;981 4 B f 47;631 |
Użyjemy funkcji seperate_rows:
1 |
separate_rows(dt,count,sep=';') |
Do rozdzielenia naszych kolumn na oddzielne wiersze:
1 2 3 4 5 6 7 8 9 10 11 |
# A tibble: 8 x 3 region gender count <chr> <chr> <chr> 1 A m 24 2 A m 34 3 A f 719 4 A f 508 5 B m 819 6 B m 981 7 B f 47 8 B f 631 |
Lub też funkcji separate:
1 |
separate(dt,count,sep=';',into = c('2020','2021')) |
Do rozdzielenia danych na dwie kolumny:
1 2 3 4 5 6 7 |
# A tibble: 4 x 4 region gender `2020` `2021` <chr> <chr> <chr> <chr> 1 A m 24 34 2 A f 719 508 3 B m 819 981 4 B f 47 631 |
Powrót do zapisu z separatorem umożliwia funkcja unite:
1 |
unite(dt,'2020','2021',col = "count",sep = "-") |
1 2 3 4 5 6 7 |
# A tibble: 4 x 3 region gender count <chr> <chr> <chr> 1 A m 24-34 2 A f 719-508 3 B m 819-981 4 B f 47-631 |
Narzędzia biblioteki tidyR są bardzo przydatne do uporządkowania naszych danych tak abyśmy mogli prowadzenić na nich analizy czy też tworzyć na ich podstawie wykresy.