library(dplyr)
data('gapminder', package = 'gapminder')

1 Przetwarzanie danych - podstawy

1.1 Indeksowanie

gapminder[1,]
gapminder[,1]
gapminder[3, 4]
gapminder[, -1]
gapminder[, c(2,3)]
gapminder[gapminder$year == 1952, ]
gapminder[gapminder$year == 1952 & gapminder$continent=='Asia',]
gapminder[gapminder$year == 1952, c(5)]
gapminder[gapminder$pop > 10000000, ]
gapminder[gapminder$continent != 'Asia',]
gapminder[gapminder$continent %in% c('Asia', 'Africa'),]

Używając indeksowania wybierz ze zbioru danych gapminder: 1) dane dla kontynentu Europa; 2) dane dla kontynentu Azja (Asia); ogranicz wybór tylko do kolumn pop oraz lifeExp. 3) obserwacje, dla których oczekiwana długość trwania życia przekroczyła 75 lat; 4) dane dla lat 1952 oraz 2007.

2 Przetwarzanie danych z pakietem dplyr

Operacja Funkcja
Tworzenie podzbioru danych: wiersze filter()
Tworzenie podzbioru danych: kolumny select()
Tworzenie nowych zmiennych mutate()
Sortowanie arrange()
Zmiana nazw kolumn rename()
Statystyki podstaowe summarize()
Grupowanie group_by()

2.1 Tworzenie podzbioru danych - wybór określonych kolumn (funkcja select())

2.1.1 Wybór kolumn country, year oraz pop.

sel1 <- select(gapminder, country, year, pop)
head(sel1)
## # A tibble: 6 x 3
##   country      year      pop
##   <fct>       <int>    <int>
## 1 Afghanistan  1952  8425333
## 2 Afghanistan  1957  9240934
## 3 Afghanistan  1962 10267083
## 4 Afghanistan  1967 11537966
## 5 Afghanistan  1972 13079460
## 6 Afghanistan  1977 14880372

Ze zbioru danych gapminder proszę wybrać dane dla zmiennych country, year oraz lifeExp.

2.1.2 Wybór wszystkich kolumn z wyjątkiem kolumny kontynent

sel2 <- select(gapminder, -continent)
head(sel2)
## # A tibble: 6 x 5
##   country      year lifeExp      pop gdpPercap
##   <fct>       <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan  1952    28.8  8425333      779.
## 2 Afghanistan  1957    30.3  9240934      821.
## 3 Afghanistan  1962    32.0 10267083      853.
## 4 Afghanistan  1967    34.0 11537966      836.
## 5 Afghanistan  1972    36.1 13079460      740.
## 6 Afghanistan  1977    38.4 14880372      786.

Ze zbioru danych gapminder proszę wybrać wszystkie kolumny z wyjątkiem continent oraz gdpPercap.

2.2 Tworzenie podzbioru danych - wybór określonych wierszy (funkcja filter())

Funkcja filter() pozwala na wybór obserwacji spełniających określone warunki. Warunki są określane za pomocą operatorów logicznych (!=, ==, >, <, >=, <=, |, &).

2.2.1 Wybór danych dla roku 2007.

filt1 <- filter(gapminder, year == 2007)
head(filt1)
## # A tibble: 6 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
## 1 Afghanistan Asia       2007    43.8 31889923      975.
## 2 Albania     Europe     2007    76.4  3600523     5937.
## 3 Algeria     Africa     2007    72.3 33333216     6223.
## 4 Angola      Africa     2007    42.7 12420476     4797.
## 5 Argentina   Americas   2007    75.3 40301927    12779.
## 6 Australia   Oceania    2007    81.2 20434176    34435.

Wybierz dane dla kontynentu Europa.

W jaki inny sposób można wybrać dane dla roku 2007?

2.2.2 Wybór danych dla roku 2007, w których oczekiwana długość trwania życia przekracza 80 lat.

filt2 <- filter(gapminder, year == 2007 & lifeExp > 80)
filt2
## # A tibble: 13 x 6
##    country          continent  year lifeExp       pop gdpPercap
##    <fct>            <fct>     <int>   <dbl>     <int>     <dbl>
##  1 Australia        Oceania    2007    81.2  20434176    34435.
##  2 Canada           Americas   2007    80.7  33390141    36319.
##  3 France           Europe     2007    80.7  61083916    30470.
##  4 Hong Kong, China Asia       2007    82.2   6980412    39725.
##  5 Iceland          Europe     2007    81.8    301931    36181.
##  6 Israel           Asia       2007    80.7   6426679    25523.
##  7 Italy            Europe     2007    80.5  58147733    28570.
##  8 Japan            Asia       2007    82.6 127467972    31656.
##  9 New Zealand      Oceania    2007    80.2   4115771    25185.
## 10 Norway           Europe     2007    80.2   4627926    49357.
## 11 Spain            Europe     2007    80.9  40448191    28821.
## 12 Sweden           Europe     2007    80.9   9031088    33860.
## 13 Switzerland      Europe     2007    81.7   7554661    37506.

Wybór danych dla roku 2007, dla wszystkich kontynentów z wyjątkiem Azji, w których oczekiwana długość trwania życia przekracza 80 lat.

2.3 Tworzenie nowych zmiennych na podstawie określonego wyrażenia (funkcja mutate())

2.3.1 Dodaj kolumnę abbr_country zawierającą trzyliterowy kod państwa.

gap2 <- mutate(gapminder, abbr_country = toupper(substr(country, 1, 3)))
head(gap2)
## # A tibble: 6 x 7
##   country     continent  year lifeExp      pop gdpPercap abbr_country
##   <fct>       <fct>     <int>   <dbl>    <int>     <dbl> <chr>       
## 1 Afghanistan Asia       1952    28.8  8425333      779. AFG         
## 2 Afghanistan Asia       1957    30.3  9240934      821. AFG         
## 3 Afghanistan Asia       1962    32.0 10267083      853. AFG         
## 4 Afghanistan Asia       1967    34.0 11537966      836. AFG         
## 5 Afghanistan Asia       1972    36.1 13079460      740. AFG         
## 6 Afghanistan Asia       1977    38.4 14880372      786. AFG

Co w powyższym poleceniu robi funkcja substr() oraz toupper()?

Dodaj do zbioru danych kolumnę pop_mln zawierająca liczbę ludności w milionach.

2.4 Sortowanie

2.4.1 Sortowanie rosnące względem zmiennej lifeExp

arr1 <- arrange(gapminder, lifeExp)
head(arr1)
## # A tibble: 6 x 6
##   country      continent  year lifeExp     pop gdpPercap
##   <fct>        <fct>     <int>   <dbl>   <int>     <dbl>
## 1 Rwanda       Africa     1992    23.6 7290203      737.
## 2 Afghanistan  Asia       1952    28.8 8425333      779.
## 3 Gambia       Africa     1952    30    284320      485.
## 4 Angola       Africa     1952    30.0 4232095     3521.
## 5 Sierra Leone Africa     1952    30.3 2143249      880.
## 6 Afghanistan  Asia       1957    30.3 9240934      821.

2.4.2 Sortowanie malejące względem zmiennej lifeExp

arr2 <- arrange(gapminder, desc(lifeExp))
head(arr2)
## # A tibble: 6 x 6
##   country          continent  year lifeExp       pop gdpPercap
##   <fct>            <fct>     <int>   <dbl>     <int>     <dbl>
## 1 Japan            Asia       2007    82.6 127467972    31656.
## 2 Hong Kong, China Asia       2007    82.2   6980412    39725.
## 3 Japan            Asia       2002    82   127065841    28605.
## 4 Iceland          Europe     2007    81.8    301931    36181.
## 5 Switzerland      Europe     2007    81.7   7554661    37506.
## 6 Hong Kong, China Asia       2002    81.5   6762476    30209.

Posortuj dane malejąco względem zmiennej pop.

2.4.3 Sortowanie rosnące względem kontynentu (continent) oraz oczekiwanej długości trwania życia (lifeExp)

arr3 <- arrange(gapminder, continent, lifeExp)
head(arr3)
## # A tibble: 6 x 6
##   country      continent  year lifeExp     pop gdpPercap
##   <fct>        <fct>     <int>   <dbl>   <int>     <dbl>
## 1 Rwanda       Africa     1992    23.6 7290203      737.
## 2 Gambia       Africa     1952    30    284320      485.
## 3 Angola       Africa     1952    30.0 4232095     3521.
## 4 Sierra Leone Africa     1952    30.3 2143249      880.
## 5 Mozambique   Africa     1952    31.3 6446316      469.
## 6 Sierra Leone Africa     1957    31.6 2295678     1004.

Posortuj malejąco względem nazwy państwa oraz rosnąco względem liczby ludności.

2.5 Zmiana nazw kolumn

2.5.1 Zmiana nazw kolumn na polskie nazwy.

W funkcji rename() definiujemy nowa_nazwa = stara_nazwa.

gap2 <- rename(gapminder, panstwo = country, kontynent = continent, rok = year, dlugosc_zycia = lifeExp, ludnosc = pop, PKB = gdpPercap)
names(gap2)
## [1] "panstwo"       "kontynent"     "rok"           "dlugosc_zycia"
## [5] "ludnosc"       "PKB"

Korzystając ze strony pomocy funkcji rename() sprawdź jak w zmienić nazwy kolumn w obiekcie gap2 na drukowane litery.

2.6 Podsumowanie - podstawowe statystyki

Funkcja summarize() służy do wykonywania podsumowań statystycznych. Tworzy kolumny z zadanymi statystykami.

2.6.1 Średnia oczekiwana długość trwania życia.

smr1 <- summarize(gapminder, 
          srednia = mean(lifeExp))

smr1
## # A tibble: 1 x 1
##   srednia
##     <dbl>
## 1    59.5

2.6.2 Średnia, minimalna oraz maksymalna oczekiwana długość trwania życia.

smr2 <- summarize(gapminder, 
          srednia = mean(lifeExp),
          min = min(lifeExp),
          max = max(lifeExp))

smr2
## # A tibble: 1 x 3
##   srednia   min   max
##     <dbl> <dbl> <dbl>
## 1    59.5  23.6  82.6

Oblicz średnią oraz odchylenie standardowe dla gdpPercap.

2.7 Statystyki w grupach

2.7.1 Średnia oczekiwana długość życia w 2007 roku według kontynentów.

Obliczenie statystyk w grupach wymaga najpierw pogrupowania danych (funkcja group_by()).

gapminder2007 <- filter(gapminder, year == 2007)
by_continent <- group_by(gapminder2007, continent)
smr_by_continent <- summarize(by_continent,
                              mean_le = mean(lifeExp))
## `summarise()` ungrouping output (override with `.groups` argument)
smr_by_continent
## # A tibble: 5 x 2
##   continent mean_le
##   <fct>       <dbl>
## 1 Africa       54.8
## 2 Americas     73.6
## 3 Asia         70.7
## 4 Europe       77.6
## 5 Oceania      80.7

Oblicz średnią oczekiwaną długość trwania życia w poszczególnych latach.

2.7.2 Średnia oczekiwana długość życia w podziale na kontynenty oraz lata.

by_continent_year <- group_by(gapminder, continent, year)
smr_by_continent_year <- summarize(by_continent_year,
                              mean_le = mean(lifeExp))
## `summarise()` regrouping output by 'continent' (override with `.groups` argument)
smr_by_continent_year
## # A tibble: 60 x 3
## # Groups:   continent [5]
##    continent  year mean_le
##    <fct>     <int>   <dbl>
##  1 Africa     1952    39.1
##  2 Africa     1957    41.3
##  3 Africa     1962    43.3
##  4 Africa     1967    45.3
##  5 Africa     1972    47.5
##  6 Africa     1977    49.6
##  7 Africa     1982    51.6
##  8 Africa     1987    53.3
##  9 Africa     1992    53.6
## 10 Africa     1997    53.6
## # … with 50 more rows

3 Układ danych - dane szerokie oraz dane długie

Zmiana układu danych jest możliwa z użyciem funkcji z pakietu tidyr.

library(tidyr)

3.1 Układ długi

Przykładem danych zapisanych w układzie długim są dane przypisane do obiektu smr_long. Składają się one z 3 kolumn. Zawierają one średnią oczekiwaną długość trwania życia według poszczególnych kontynentów oraz lat.

by_continent_year <- group_by(gapminder, continent, year)
smr_long <- summarize(by_continent_year,
                              mean_le = mean(lifeExp))
## `summarise()` regrouping output by 'continent' (override with `.groups` argument)
head(smr_long)
## # A tibble: 6 x 3
## # Groups:   continent [1]
##   continent  year mean_le
##   <fct>     <int>   <dbl>
## 1 Africa     1952    39.1
## 2 Africa     1957    41.3
## 3 Africa     1962    43.3
## 4 Africa     1967    45.3
## 5 Africa     1972    47.5
## 6 Africa     1977    49.6

3.2 Układ długi -> Układ szeroki.

W formacie szerokim każdy wiersz to osobny kontynent a każda kolumna to rok.

smr_wide = pivot_wider(smr_long, 
                             names_from = year, 
                             values_from = mean_le)

smr_wide
## # A tibble: 5 x 13
## # Groups:   continent [5]
##   continent `1952` `1957` `1962` `1967` `1972` `1977` `1982` `1987` `1992`
##   <fct>      <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
## 1 Africa      39.1   41.3   43.3   45.3   47.5   49.6   51.6   53.3   53.6
## 2 Americas    53.3   56.0   58.4   60.4   62.4   64.4   66.2   68.1   69.6
## 3 Asia        46.3   49.3   51.6   54.7   57.3   59.6   62.6   64.9   66.5
## 4 Europe      64.4   66.7   68.5   69.7   70.8   71.9   72.8   73.6   74.4
## 5 Oceania     69.3   70.3   71.1   71.3   71.9   72.9   74.3   75.3   76.9
## # … with 3 more variables: `1997` <dbl>, `2002` <dbl>, `2007` <dbl>

Oblicz średnią oczekiwaną długość trwania życia w poszczególnych latach i przedstaw wynik w układzie szerokim.

3.3 Układ szeroki -> Układ długi

nms = names(smr_wide)[-1]
smr_long2 = pivot_longer(smr_wide, 
                         cols = nms)
## Note: Using an external vector in selections is ambiguous.
## ℹ Use `all_of(nms)` instead of `nms` to silence this message.
## ℹ See <https://tidyselect.r-lib.org/reference/faq-external-vector.html>.
## This message is displayed once per session.
head(smr_long2)
## # A tibble: 6 x 3
## # Groups:   continent [1]
##   continent name  value
##   <fct>     <chr> <dbl>
## 1 Africa    1952   39.1
## 2 Africa    1957   41.3
## 3 Africa    1962   43.3
## 4 Africa    1967   45.3
## 5 Africa    1972   47.5
## 6 Africa    1977   49.6

Oblicz średnią wartość gdpPercap w podziale na poszczególne kontynenty oraz lata. Przedstaw wynik w “układzie szerokim” - każdy wiersz to określony kontynent, a każda kolumna to określony rok.

4 Zadanie

4.1 Dane

Pakiet nycflights13 zawiera dane dotyczące wszystkich lotów, jakie miały miejsce w 2013 roku z jednego z 3 nowojorskich lotnisk: JFK, EWR oraz LGA. Do wykonania zadania należy wykorzystać dane zawarte w zbiorze danych flights. Zbiór danych flights z pakietu nycflights13 zawiera następujące informacje:

  • year, month, day: data przylotu
  • dep_time, arr_time: Czas odlotu (departure) oraz przylotu (arrival) w lokalnej strefie czasowej
  • dep_delay, arr_delay: Opóźnienie odlotu (departure) oraz opóźnienie przylotu (arrival), w minutach. Wartości ujemne wkazują na wcześniejszy odlot/przylot.
  • carrier: skrót nazwy przewoźnika (patrz poniżej)
  • tailnum: Numer samolotu
  • flight: Numer rejsu (lotu)
  • origin, dest: Oznaczenie lotniska odlotu (origin) oraz lotniska docelowego (dest)
  • air_time: Ilość czasu w powietrzu, w minutach.
  • distance: przeleciana odległość, w milach.
  • hour, minute: czas przylotu rozbity na godziny i minuty.

Objaśnienia do zmiennej carrier:

  • 9E: Endeavor Air Inc.
  • AA: American Airlines Inc. 
  • AS: Alaska Airlines Inc. 
  • B6: JetBlue Airways
  • DL: Delta Air Lines Inc. 
  • EV: ExpressJet Airlines Inc. 
  • F9: Frontier Airlines Inc. 
  • FL: AirTran Airways Corporation
  • HA: Hawaiian Airlines Inc. 
  • MQ: Envoy Air
  • OO: SkyWest Airlines Inc. 
  • UA: United Air Lines Inc. 
  • US: US Airways Inc. 
  • VX: Virgin America
  • WN: Southwest Airlines Co. 
  • YV: Mesa Airlines Inc. 

4.2 Zadania do wykonania

  • Ile lotów odbyło się 25 grudnia 2013 roku?
  • Wybrać loty, które miały miejsce w miesiącach letnich (lipiec, sierpień, wrzesień)?
  • Wybrać loty, które leciały do Houston (IAH, HOU)? Ile było takich lotów?
  • Wybrać loty, które były obsługiwane przez United, American lub Delta.
  • Wybrać loty, które przyleciały z dwugodzinnym lub większym opóźnieniem (podpowiedź: zmienna arr_delay ma wartości w minutach).Posortować dane od największego do najmniejszego opóźnienia. Wyświetl 4 pierwsze wiersze.
  • Dodaj do zbioru danych nową zmienną ‘gain’ wskazującą ile czasu samolot nadrobił w trakcie lotu (gain = dep_delay - arr_delay). Co oznacza wartość ujemna zmiennej gain? Wykonaj histogram pokazujący rozkład wartości zmiennej gain.
  • Stwórz nową ramkę danych time zawierającą zmienne dep_time, dep_delay, arr_time, and arr_delay. Znajdź jak najwięcej sposobów, wyseleckcjonowania zmiennych dep_time, dep_delay, arr_time, and arr_delay.
  • Sformułuj 3 różne pytania i odpowiedz na nie używając ramki danych flights.