Dplyr – manipulacja data frame
W dziesiejszym poście zapoznamy Was z biblioteką dplyr, która w łatwy sposób pozwala manipulować zmiennymi typu data frame. Do naszego przykładu wykorzystamy wykaz pól powierzchni geodezyjnych, który możecie pobrać tutaj w ramach otwartych danych.
Zainicjujmy bibliotekę:
1 |
library(dplyr) |
Wczytajmy dane:
1 |
dt = readr::read_csv("d:/GIS_in_R/powierzchnie.csv") |
W pierwszej kolejności wykorzystamy narzędzie filter pozwalające na wyselekcjonowanie wierszy spełniających zadane kryterium. W naszym przypadku będą to powiaty dla których TERYT ma 5 znaków:
1 |
dt %›% filter(nchar(TERYT) == 5) |
W wyniku otrzymujemy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 380 x 3 TERYT `Nazwa jednostki` `Powierzchnia` ‹chr› ‹chr› ‹dbl› 1 02 01 Powiat bolesławiecki 130351 2 02 02 Powiat dzierżoniowski 47851 3 02 03 Powiat głogowski 44327 4 02 04 Powiat górowski 73827 5 02 05 Powiat jaworski 58155 6 02 06 Powiat jeleniogórski 62714 7 02 07 Powiat kamiennogórski 39569 8 02 08 Powiat kłodzki 164330 9 02 09 Powiat legnicki 74408 10 02 10 Powiat lubański 42830 # ... with 370 more rows |
Dodajmy do naszej poprzedniej linijki kodu jeszcze funkcję mutate za pomocą której możemy wyliczyć nową wartość (kolumnę). My wyznaczymy na podstawie TERYTu powiatu TERYT województwa (TERYT_woj) przy użyciu funkcji substr:
1 2 |
dt %›% filter(nchar(TERYT) == 5) %›% mutate(TERYT_woj = substr(TERYT,0,2)) |
W wyniku mamy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 380 x 4 TERYT `Nazwa jednostki` `Powierzchnia` TERYT_woj ‹chr› ‹chr› ‹dbl› ‹chr› 1 02 01 Powiat bolesławiecki 130351 02 2 02 02 Powiat dzierżoniowski 47851 02 3 02 03 Powiat głogowski 44327 02 4 02 04 Powiat górowski 73827 02 5 02 05 Powiat jaworski 58155 02 6 02 06 Powiat jeleniogórski 62714 02 7 02 07 Powiat kamiennogórski 39569 02 8 02 08 Powiat kłodzki 164330 02 9 02 09 Powiat legnicki 74408 02 10 02 10 Powiat lubański 42830 02 # ... with 370 more rows |
Za pomocą funkcji select wybieramy interesujące nas kolumny:
1 |
dt %›% select(TERYT,'Nazwa jednostki') |
I mamy:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 4,201 x 2 TERYT `Nazwa jednostki` ‹chr› ‹chr› 1 00 POLSKA 2 02 WOJ. DOLNOŚLĄSKIE 3 02 01 Powiat bolesławiecki 4 02 01 01 1 Bolesławiec 5 02 01 02 2 Bolesławiec 6 02 01 03 2 Gromadka 7 02 01 04 3 Nowogrodziec 8 02 01 04 4 Nowogrodziec - miasto 9 02 01 04 5 Nowogrodziec - obszar wiejski 10 02 01 05 2 Osiecznica # ... with 4,191 more rows |
Wykonany wcześniej select wykorzystamy do dodanie do naszych powiatów nazw województw, korzystając z left_join z grupy funkcji join:
1 2 3 |
dt %›% filter(nchar(TERYT) == 5) %›% mutate(TERYT_woj = substr(TERYT,0,2)) %›% left_join(dt %›% select(TERYT,'Nazwa jednostki'), by = c("TERYT_woj" = "TERYT")) |
Uzupełniona tabela wygląda następująco:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 380 x 5 TERYT `Nazwa jednostki.x` `Powierzchnia` TERYT_woj `Nazwa jednostki.y` ‹chr› ‹chr› ‹dbl› ‹chr› ‹chr› 1 02 01 Powiat bolesławiecki 130351 02 WOJ. DOLNOŚLĄSKIE 2 02 02 Powiat dzierżoniowski 47851 02 WOJ. DOLNOŚLĄSKIE 3 02 03 Powiat głogowski 44327 02 WOJ. DOLNOŚLĄSKIE 4 02 04 Powiat górowski 73827 02 WOJ. DOLNOŚLĄSKIE 5 02 05 Powiat jaworski 58155 02 WOJ. DOLNOŚLĄSKIE 6 02 06 Powiat jeleniogórski 62714 02 WOJ. DOLNOŚLĄSKIE 7 02 07 Powiat kamiennogórski 39569 02 WOJ. DOLNOŚLĄSKIE 8 02 08 Powiat kłodzki 164330 02 WOJ. DOLNOŚLĄSKIE 9 02 09 Powiat legnicki 74408 02 WOJ. DOLNOŚLĄSKIE 10 02 10 Powiat lubański 42830 02 WOJ. DOLNOŚLĄSKIE # ... with 370 more rows |
Na końcu w naszej długiej linijce kodu dodamy select tylko interesujących nas w wynikowej tabeli kolumn (TERYT, Nazwa jednostki, Powierzchnia i Nazwa województwa). Nadamy im nowe nazwy (TERYT, Nazwa, Pow, Woj). Wynik zapiszemy do zmiennej dt:
1 2 3 4 |
dt = dt %›% filter(nchar(TERYT) == 5) %›% mutate(TERYT_woj = substr(TERYT,0,2)) %›% left_join(dt %›% select(TERYT,'Nazwa jednostki'), by = c("TERYT_woj" = "TERYT")) %›% select(TERYT,Nazwa = `Nazwa jednostki.x`,Pow = `Powierzchnia` ,Woj = `Nazwa jednostki.y`) |
Zmienna dt powinna zawierać takie dane:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# A tibble: 380 x 4 TERYT Nazwa Pow Woj ‹chr› ‹chr› ‹dbl› ‹chr› 1 02 01 Powiat bolesławiecki 130351 WOJ. DOLNOŚLĄSKIE 2 02 02 Powiat dzierżoniowski 47851 WOJ. DOLNOŚLĄSKIE 3 02 03 Powiat głogowski 44327 WOJ. DOLNOŚLĄSKIE 4 02 04 Powiat górowski 73827 WOJ. DOLNOŚLĄSKIE 5 02 05 Powiat jaworski 58155 WOJ. DOLNOŚLĄSKIE 6 02 06 Powiat jeleniogórski 62714 WOJ. DOLNOŚLĄSKIE 7 02 07 Powiat kamiennogórski 39569 WOJ. DOLNOŚLĄSKIE 8 02 08 Powiat kłodzki 164330 WOJ. DOLNOŚLĄSKIE 9 02 09 Powiat legnicki 74408 WOJ. DOLNOŚLĄSKIE 10 02 10 Powiat lubański 42830 WOJ. DOLNOŚLĄSKIE # ... with 370 more rows |
Dla utworzonej tabeli wyliczymy minimalną, średnią i maksymalną powierzchnię powiatów z wykorzystaniem narzędzia summarise:
1 |
dt %›% summarise(min = min(Pow), avg = mean(Pow), max = max(Pow)) |
1 2 3 4 |
# A tibble: 1 x 3 min avg max ‹dbl› ‹dbl› ‹dbl› 1 1331 82291. 297644 |
W przypadku gdy chcemy wyliczyć te wartości dla województw naszą linjkę należy uzupełnić o funcję grupującą group_by:
1 2 |
dt %›% group_by(Woj) %›% summarise(min = min(Pow), avg = mean(Pow), max = max(Pow)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# A tibble: 16 x 4 Woj min avg max ‹chr› ‹dbl› ‹dbl› ‹dbl› 1 WOJ. DOLNOŚLĄSKIE 5629 66489 164330 2 WOJ. KUJAWSKO-POMORSKIE 5776 78136. 147418 3 WOJ. LUBELSKIE 3034 104677. 275426 4 WOJ. LUBUSKIE 8572 99914. 139278 5 WOJ. ŁÓDZKIE 3460 75912. 149083 6 WOJ. MAŁOPOLSKIE 5758 69013. 154980 7 WOJ. MAZOWIECKIE 3186 84663. 209355 8 WOJ. OPOLSKIE 14888 78432. 153430 9 WOJ. PODKARPACKIE 4472 71383. 130837 10 WOJ. PODLASKIE 3267 118747. 297644 11 WOJ. POMORSKIE 1728 91618. 230424 12 WOJ. ŚLĄSKIE 1331 34259. 152205 13 WOJ. ŚWIĘTOKRZYSKIE 10965 83646. 224607 14 WOJ. WARMIŃSKO-MAZURSKIE 7982 115112. 283802 15 WOJ. WIELKOPOLSKIE 3186 85219. 189988 16 WOJ. ZACHODNIOPOMORSKIE 9834 109070. 186911 |
Dodajmy jeszcze liczbę powiatów:
1 2 |
dt %›% group_by(Woj) %›% summarise(nr = length(Pow), min = min(Pow), avg = mean(Pow), max = max(Pow)) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# A tibble: 16 x 5 Woj nr min avg max ‹chr› ‹int› ‹dbl› ‹dbl› ‹dbl› 1 WOJ. DOLNOŚLĄSKIE 30 5629 66489 164330 2 WOJ. KUJAWSKO-POMORSKIE 23 5776 78136. 147418 3 WOJ. LUBELSKIE 24 3034 104677. 275426 4 WOJ. LUBUSKIE 14 8572 99914. 139278 5 WOJ. ŁÓDZKIE 24 3460 75912. 149083 6 WOJ. MAŁOPOLSKIE 22 5758 69013. 154980 7 WOJ. MAZOWIECKIE 42 3186 84663. 209355 8 WOJ. OPOLSKIE 12 14888 78432. 153430 9 WOJ. PODKARPACKIE 25 4472 71383. 130837 10 WOJ. PODLASKIE 17 3267 118747. 297644 11 WOJ. POMORSKIE 20 1728 91618. 230424 12 WOJ. ŚLĄSKIE 36 1331 34259. 152205 13 WOJ. ŚWIĘTOKRZYSKIE 14 10965 83646. 224607 14 WOJ. WARMIŃSKO-MAZURSKIE 21 7982 115112. 283802 15 WOJ. WIELKOPOLSKIE 35 3186 85219. 189988 16 WOJ. ZACHODNIOPOMORSKIE 21 9834 109070. 186911 |
I na koniec posortujmy nasze wyniki po liczbie powiatów używając funkcji arrange:
1 2 3 |
dt %›% group_by(Woj) %›% summarise(nr = length(Pow), min = min(Pow), avg = mean(Pow), max = max(Pow)) %›% arrange(nr) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# A tibble: 16 x 5 Woj nr min avg max ‹chr› ‹int› ‹dbl› ‹dbl› ‹dbl› 1 WOJ. OPOLSKIE 12 14888 78432. 153430 2 WOJ. LUBUSKIE 14 8572 99914. 139278 3 WOJ. ŚWIĘTOKRZYSKIE 14 10965 83646. 224607 4 WOJ. PODLASKIE 17 3267 118747. 297644 5 WOJ. POMORSKIE 20 1728 91618. 230424 6 WOJ. WARMIŃSKO-MAZURSKIE 21 7982 115112. 283802 7 WOJ. ZACHODNIOPOMORSKIE 21 9834 109070. 186911 8 WOJ. MAŁOPOLSKIE 22 5758 69013. 154980 9 WOJ. KUJAWSKO-POMORSKIE 23 5776 78136. 147418 10 WOJ. LUBELSKIE 24 3034 104677. 275426 11 WOJ. ŁÓDZKIE 24 3460 75912. 149083 12 WOJ. PODKARPACKIE 25 4472 71383. 130837 13 WOJ. DOLNOŚLĄSKIE 30 5629 66489 164330 14 WOJ. WIELKOPOLSKIE 35 3186 85219. 189988 15 WOJ. ŚLĄSKIE 36 1331 34259. 152205 16 WOJ. MAZOWIECKIE 42 3186 84663. 209355 |
Wiesze zostały posortowane od najmniejszej do największej liczby powiatów w województwach. Odwrotne sortowanie uzyskamy dodając na końcu naszego kodu:
1 |
arrange(desc(nr)) |
Zaprezentowaliśmy Wam na przykładzie jak działają najczęściej używane funkcje z biblioteki dplyr:
- select – wybór kolumn,
- filter – wybór wierszy na podstawie wyrażenia,
- mutate – wyliczenie nowych danych na podstawie istniejących,
- left_join – łączenie dwóch tabel (jest wiele innych rodzajów),
- summarise – wyliczanie zestawień z wartości,
- group_by – grupowanie po wartościach w kolumnie,
- arrange – sortowanie wierszy po wartościach w kolumnach.
Biblioteka zawiera wiele innych funkcji z którymi musicie zapoznać się sami.