Instalacja oprogramowania R, R Studio.

version
##                _                           
## platform       x86_64-apple-darwin15.6.0   
## arch           x86_64                      
## os             darwin15.6.0                
## system         x86_64, darwin15.6.0        
## status                                     
## major          3                           
## minor          5.1                         
## year           2018                        
## month          07                          
## day            02                          
## svn rev        74947                       
## language       R                           
## version.string R version 3.5.1 (2018-07-02)
## nickname       Feather Spray

RStudio

Pakiety

# install
install.packages("dplyr")
# install from github
devtools::install_github("pbiecek/PrzewodnikPakiet")
# load 
library(dplyr)
# check version
packageVersion("dplyr")
# get the list of all installed packages
library()
# get the list of all loaded packages
search()
# main folder
getwd()
# setwd() - choose main folder
# check files
list.files()

Możesz również zainstalować i używać R Studio z pakietu Anaconda.

Wszystkie aktualnie stworzone zmienne można znaleźć za pomocą funckji:

x <- 4
y <- "napis"
# all features
ls()
## [1] "x" "y"
# delete features from environment
rm(x)
ls()
## [1] "y"

Zadanie domowe zaznajomić się z R Markdown

Wczytywanie danych z plików tekstowych

Bardzo często dane przechowywane są w płaskich plikach tekstowych. Pliki tego typu to nie tylko pliki z rozszerzeniem txt. Są to wszystkie pliki, które zawierają tekst. Można otworzyć je w dowolnym edytorze tekstowym (również w RStudio). Dane tabelaryczne najczęściej przechowuje się w plikach csv, tsv, dat lub txt.

Pamiętaj. Pliki z których wczytujesz dane nie muszą znajdować się na Twoim dysku. np https://sebastianzajac.pl/data/dane.csv

W plikach csv dane oddzielone powinny być znakiem , ale często stosuje się również średnik ;.

Funkcja pozwalająca wczytać dane z plików do RStudio to read.table().

testowe_dane <- read.table('https://sebastianzajac.pl/data/dane.csv', sep=';', header = TRUE)
# print all data
testowe_dane
##           gatunek waga dlugosc predkosc  habitat zywotnosc druzyna
## 1          Tygrys  300     2,5       60     Azja        25     Kot
## 2             Lew  200       2       80   Afryka        29     Kot
## 3          Jaguar  100     1,7       90  Ameryka        15     Kot
## 4            Puma   80     1,7       70  Ameryka        13     Kot
## 5         Leopard   70     1,4       85     Azja        21     Kot
## 6          Gepard   60     1,4      115   Afryka        12     Kot
## 7           Irbis   50     1,3       65     Azja        18     Kot
## 8          Jerzyk 0,05     0,2      170 Euroazja        20    Ptak
## 9           Strus  150     2,5       70   Afryka        45    Ptak
## 10  Orzel przedni    5     0,9      160   Polnoc        20    Ptak
## 11 Sokol wedrowny  0,7     0,5      110   Polnoc        15    Ptak
## 12 Sokol norweski    2     0,7      100   Polnoc        20    Ptak
## 13       Albatros    4     0,8      120 Poludnie        50    Ptak

W programie R Studio w prawym górnym oknie, zatytułowanym Environment wyświetlane są symbole widoczne w głównym środowisku. Dwukrotne kliknięcie na wskazany symbol spowoduje otwarcie okna prezentującego zawartość zmiennej. W ten sposób możemy szybko podejrzeć co wczytało się do zmiennej koty_ptaki. Z przyczyn wydajnościowych wyświetlanych jest tylko pierwsze 1000 wierszy i kilkaset kolumn. Tak więc dla dużych zbiorów danych wyświetlony będzie tylko fragment całego zbioru.

Excel

Zadanie 2 Za pomocą Import Dataset wczytaj dane z excela.

Czyszczenie i przetwarzanie danych

library(dplyr)
## Warning: package 'dplyr' was built under R version 3.5.2
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(Przewodnik)
## Loading required package: PogromcyDanych
## Loading required package: SmarterPoland
## Loading required package: ggplot2
## Loading required package: httr
## Loading required package: htmltools
## Loading required package: PBImisc

Program R jest wyposażony w olbrzymią liczbę funkcji do przetwarzania danych.

Hadley Wickham przygotował dwa pakiety, dplyr i tidyr które w sumie udostępniają jedynie kilka funkcji, jednak te funkcje można na tyle elastycznie łączyć, że w sumie pozwalają one na wykonanie większości typowych operacji na danych.

Funkcje w tych pakietach nazwał czasownikami a proces analizy danych przyrównał do konstrukcji zdania. Podstawowymi czasownikami są

Filtrowanie wierszy

Jedną z najczęstszych operacji na danych jest filtrowanie wierszy, które spełniają określony warunek / warunki.

Funkcja filter() pakietu dplyr wykonuje filtrowanie. Jej pierwszym argumentem jest zbiór danych na których ma pracować, a kolejne argumenty to warunki logiczne.

Wynikiem tej funkcji są wiersze spełniające wszystkie określone warunki logiczne. Określając warunki można wykorzystywać nazwy kolumn ze zbioru danych bez podawania dodatkowych odnośników.

tmp <- filter(auta2012, Marka=='Porsche')
head(tmp)
##     Cena Waluta Cena.w.PLN Brutto.netto  KM  kW   Marka         Model
## 1 244900    PLN     244900        netto 388 285 Porsche           911
## 2 229000    PLN     229000       brutto 355 261 Porsche           911
## 3 133990    PLN     133990        netto 295 217 Porsche       Boxster
## 4 154900    PLN     154900       brutto 295 217 Porsche       Boxster
## 5 162520    PLN     162520        netto 500 368 Porsche Cayenne Turbo
## 6 162520    PLN     162520        netto 500 368 Porsche       Cayenne
##   Wersja Liczba.drzwi Pojemnosc.skokowa Przebieg.w.km Rodzaj.paliwa
## 1                 2/3              5461         32350       benzyna
## 2                 2/3              3824         63000       benzyna
## 3                 2/3              3387         52849       benzyna
## 4                 2/3              3387         52849       benzyna
## 5                 4/5              4806         57000       benzyna
## 6                 4/5              4511         62000       benzyna
##   Rok.produkcji            Kolor Kraj.aktualnej.rejestracji
## 1          2008 srebrny-metallic                     Polska
## 2          2007  czarny-metallic                     Polska
## 3          2007  czarny-metallic                     Polska
## 4          2007  czarny-metallic                     Polska
## 5          2007  czarny-metallic                     Polska
## 6          2007  czarny-metallic                     Polska
##   Kraj.pochodzenia Pojazd.uszkodzony Skrzynia.biegow
## 1           Polska                      automatyczna
## 2           Polska                          manualna
## 3           Polska                      automatyczna
## 4           Polska                      automatyczna
## 5           Polska                      automatyczna
## 6           Polska                      automatyczna
##   Status.pojazdu.sprowadzonego
## 1                             
## 2                             
## 3                             
## 4                             
## 5                             
## 6                             
##                                                                                                                                                                                                                                                                                                                                                                          Wyposazenie.dodatkowe
## 1                           ABS, el. szyby, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, szyberdach, ASR, centralny zamek, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, lwiatla przeciwmglowe, kierownica wielofunkcyjna, czujnik parkowania, reg. wysokole podwozia
## 2                                                                                                     ABS, 4x4, hak, el. szyby, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, ESP, czujnik parkowania
## 3                                                                                                                                                                                                             ABS, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, szyberdach, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, immobiliser, ksenony, czujnik parkowania
## 4                                                                                                                                          ABS, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, podgrzewane fotele, czujnik deszczu, lwiatla przeciwmglowe
## 5                                               ABS, 4x4, el. szyby, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, lwiatla przeciwmglowe, kierownica wielofunkcyjna, czujnik parkowania
## 6 ABS, 4x4, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, ESP, EDS, lwiatla przeciwmglowe, kierownica wielofunkcyjna, niezalezne ogrzewanie, czujnik parkowania, reg. wysokole podwozia

Dodatkowe warunki:

tylkoPorscheZDuzymSilnikiem <- filter(auta2012,
         Marka == "Porsche",
         KM > 300)
head(tylkoPorscheZDuzymSilnikiem)
##     Cena Waluta Cena.w.PLN Brutto.netto  KM  kW   Marka         Model
## 1 244900    PLN     244900        netto 388 285 Porsche           911
## 2 229000    PLN     229000       brutto 355 261 Porsche           911
## 3 162520    PLN     162520        netto 500 368 Porsche Cayenne Turbo
## 4 162520    PLN     162520        netto 500 368 Porsche       Cayenne
## 5  69900    PLN      69900       brutto 340 250 Porsche       Cayenne
## 6 359000    PLN     359000       brutto 400 294 Porsche      Panamera
##   Wersja Liczba.drzwi Pojemnosc.skokowa Przebieg.w.km Rodzaj.paliwa
## 1                 2/3              5461         32350       benzyna
## 2                 2/3              3824         63000       benzyna
## 3                 4/5              4806         57000       benzyna
## 4                 4/5              4511         62000       benzyna
## 5                 4/5              4511         94000       benzyna
## 6                 4/5              4800         29000       benzyna
##   Rok.produkcji            Kolor Kraj.aktualnej.rejestracji
## 1          2008 srebrny-metallic                     Polska
## 2          2007  czarny-metallic                     Polska
## 3          2007  czarny-metallic                     Polska
## 4          2007  czarny-metallic                     Polska
## 5          2004   szary-metallic                     Polska
## 6          2010  bezowy-metallic                     Polska
##    Kraj.pochodzenia Pojazd.uszkodzony Skrzynia.biegow
## 1            Polska                      automatyczna
## 2            Polska                          manualna
## 3            Polska                      automatyczna
## 4            Polska                      automatyczna
## 5 Stany Zjednoczone                      automatyczna
## 6                                        automatyczna
##   Status.pojazdu.sprowadzonego
## 1                             
## 2                             
## 3                             
## 4                             
## 5                             
## 6                             
##                                                                                                                                                                                                                                                                                                                                                                                                                                       Wyposazenie.dodatkowe
## 1                                                                                        ABS, el. szyby, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, szyberdach, ASR, centralny zamek, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, lwiatla przeciwmglowe, kierownica wielofunkcyjna, czujnik parkowania, reg. wysokole podwozia
## 2                                                                                                                                                                  ABS, 4x4, hak, el. szyby, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, ESP, czujnik parkowania
## 3                                                                                                            ABS, 4x4, el. szyby, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, lwiatla przeciwmglowe, kierownica wielofunkcyjna, czujnik parkowania
## 4                                                              ABS, 4x4, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, ESP, EDS, lwiatla przeciwmglowe, kierownica wielofunkcyjna, niezalezne ogrzewanie, czujnik parkowania, reg. wysokole podwozia
## 5 ABS, 4x4, hak, el. szyby, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, szyberdach, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, instalacja gazowa, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, ESP, lwiatla przeciwmglowe, kierownica wielofunkcyjna, czujnik parkowania, reg. wysokole podwozia, bagaznik na dach, przyciemniane szyby, pod. przednia szyba
## 6                   ABS, 4x4, el. szyby, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, system nawigacji, szyberdach, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, ksenony, tempomat, podgrzewane fotele, czujnik deszczu, ESP, EDS, lwiatla przeciwmglowe, kierownica wielofunkcyjna, czujnik parkowania, reg. wysokole podwozia, przyciemniane szyby, blokada dyferencjalu

Filtrowanie kolumn

Dane potrafią zawierać dużą liczbę kolumn. Ale często pracujemy tylko na kilku z nich. Usunięcie pozostałych spowoduje, że dane będą mniejsze i operacje na nich będą szybsze.

Inną zaletą wybierania jedynie potrzebnych kolumn jest łatwiejsze wyświetlanie danych. Zamiast pokazywać wszystkie, nawet nieistotne kolumny, często lepiej pokazać jedynie te istotne.

Funkcja select() z pakietu dplyr pozwala na wybór jednej lub wielu zmiennych ze źródła danych. Pierwszym argumentem jest źródło danych a kolejnymi są nazwy kolumn, które mają być wybrane. Przykładowo, poniższa instrukcja wybiera jedynie rodzaj paliwa i rok produkcji.

tmp <- select(auta2012, Rodzaj.paliwa, Rok.produkcji)
head(tmp)
##            Rodzaj.paliwa Rok.produkcji
## 1 olej napedowy (diesel)          2008
## 2 olej napedowy (diesel)          2008
## 3 olej napedowy (diesel)          2009
## 4 olej napedowy (diesel)          2003
## 5 olej napedowy (diesel)          2007
## 6 olej napedowy (diesel)          2004

Poza wskazywaniem wszystkich kolumn przez nazwę można również korzystać z operatora negacji - (wszystkie kolumny poza wskazanymi) lub z funkcji matches(), starts_with(), ends_with() pozwalających na definiowanie grup nazw kolumn spełniających określone warunki

tmp <- select(auta2012, starts_with("Cena"))
head(tmp)
##    Cena Cena.w.PLN
## 1 49900      49900
## 2 88000      88000
## 3 86000      86000
## 4 25900      25900
## 5 55900      55900
## 6 45900      45900

Tworzenie nowych kolumn

Modelowanie czy przetwarzanie danych często wymaga tworzenia nowych zmiennych na bazie istniejących. Czasem na podstawie ceny buduje się logarytm ceny (jedna kolumna z jednej kolumny), czasem na podstawie wagi i wzrostu liczy się BMI (jedna zmienna z kilku zmiennych).

Funkcja mutate() z pakietu dplyr pozwala na wygodne tworzenie dodatkowych kolumn w zbiorze danych na podstawie innych istniejących już kolumn.

Przedstawmy działanie tej funkcji na przykładzie danych auta2012 o samochodach. w pierwszym przykładzie policzymy wiek auta (a ponieważ przedstawione ogłoszenia pochodzą z 2013 roku to wiek będzie równy 2013 - rok produkcji).

Kolejny przykład przekształca dwie kolumny w jedną. Na podstawie ceny w PLN oraz informacji czy jest to cena brutto czy netto policzymy odpowiednik ceny brutto dla wszystkich ofert.

autaZWiekiem <- mutate(auta2012,
                       Wiek.auta = 2019 - Rok.produkcji)
head(autaZWiekiem[,c("Wiek.auta", "Rok.produkcji")])
##   Wiek.auta Rok.produkcji
## 1        11          2008
## 2        11          2008
## 3        10          2009
## 4        16          2003
## 5        12          2007
## 6        15          2004

Przetwarzanie kolumn może być bardziej złożone i może dotyczyć zmiennych które nie są liczbami. Na poniższym przykładzie wykorzystujemy funkcją grepl() wyznaczająca wektor wartości TRUE/FALSE w zależności od tego czy w analizowanym napisie występuje określony wzorzec.

Na podstawie kolumny Wyposazenie.dodatkowe wyznaczany binarne zmienne opisujące czy dane auto ma autoalarm, centralny zamek kub klimatyzację.

autaZWyposazeniem <- mutate(auta2012,
         Autoalarm = grepl(pattern = "autoalarm", Wyposazenie.dodatkowe),
         Centralny.zamek = grepl(pattern = "centralny zamek", Wyposazenie.dodatkowe),
         Klimatyzacja = grepl(pattern = "klimatyzacja", Wyposazenie.dodatkowe))

head(autaZWyposazeniem)
##    Cena Waluta Cena.w.PLN Brutto.netto  KM  kW         Marka     Model
## 1 49900    PLN      49900       brutto 140 103           Kia    Carens
## 2 88000    PLN      88000       brutto 156 115    Mitsubishi Outlander
## 3 86000    PLN      86000       brutto 150 110     Chevrolet   Captiva
## 4 25900    PLN      25900       brutto 163 120         Volvo       S80
## 5 55900    PLN      55900        netto  NA  NA Mercedes-Benz  Sprinter
## 6 45900    PLN      45900        netto 150 110 Mercedes-Benz     Viano
##   Wersja Liczba.drzwi Pojemnosc.skokowa Przebieg.w.km
## 1                 4/5              1991         41000
## 2                 4/5              2179         46500
## 3                 4/5              1996          8000
## 4                 4/5              2400        200000
## 5                 4/5              2200        169400
## 6                 4/5              2200        141100
##            Rodzaj.paliwa Rok.produkcji            Kolor
## 1 olej napedowy (diesel)          2008                 
## 2 olej napedowy (diesel)          2008                 
## 3 olej napedowy (diesel)          2009                 
## 4 olej napedowy (diesel)          2003 srebrny-metallic
## 5 olej napedowy (diesel)          2007            bialy
## 6 olej napedowy (diesel)          2004 bordowy-metallic
##   Kraj.aktualnej.rejestracji Kraj.pochodzenia Pojazd.uszkodzony
## 1                     Polska                                   
## 2                     Polska                                   
## 3                     Polska                                   
## 4                     Polska           Wlochy                  
## 5                                                              
## 6                                                              
##   Skrzynia.biegow Status.pojazdu.sprowadzonego
## 1        manualna                             
## 2        manualna                             
## 3        manualna                             
## 4        manualna sprowadzony / zarejestrowany
## 5        manualna                             
## 6        manualna                             
##                                                                                                                                                                                                                                             Wyposazenie.dodatkowe
## 1                                                                                      ABS, el. lusterka, klimatyzacja, alufelgi, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, przyciemniane szyby
## 2                                                              ABS, 4x4, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, centralny zamek, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, tempomat, przyciemniane szyby
## 3                                                   ABS, 4x4, el. lusterka, klimatyzacja, skorzana tapicerka, alufelgi, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, tempomat, przyciemniane szyby
## 4 ABS, hak, el. szyby, el. lusterka, klimatyzacja, alufelgi, ASR, centralny zamek, autoalarm, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, komputer, welurowa tapicerka, tempomat, ESP, lwiatla przeciwmglowe, kierownica wielofunkcyjna
## 5                                                                                                                                                                                                  ABS, ASR, centralny zamek, wspomaganie kierownicy, immobiliser
## 6                                                                                                      ABS, el. szyby, el. lusterka, klimatyzacja, ASR, centralny zamek, poduszka powietrzna, radio / CD, wspomaganie kierownicy, immobiliser, welurowa tapicerka
##   Autoalarm Centralny.zamek Klimatyzacja
## 1      TRUE            TRUE         TRUE
## 2     FALSE            TRUE         TRUE
## 3      TRUE            TRUE         TRUE
## 4      TRUE            TRUE         TRUE
## 5     FALSE            TRUE        FALSE
## 6     FALSE            TRUE         TRUE

Sortowanie

Sortowanie danych po określonej kolumnie znacznie ułatwia analizę wartości w tej kolumnie. Przede wszystkim natychmiast widać wartości skrajne, sortowanie jest więc wygodne podczas eksploracji danych.

Funkcją arrange() z pakietu dplyr możemy wykonać sortowanie po jednej lub większej liczbie zmiennych. W przypadku remisów ze względu na pierwsze kryteria, porządek rozstrzygają kolejne kryteria.

W przykładzie poniżej w pierwszej kolejności dane są sortowane po wartościach z kolumny Model. Dopiero w przypadku, gdy w tej kolumnie znajdują się takie same wartości, ich kolejność jest rozstrzygana przez kolejną zmienną, cena w PLN

posortowaneAuta <- arrange(auta2012, Model, Cena.w.PLN)

head(select(posortowaneAuta, Model, Marka, Cena.w.PLN, Cena, Waluta))
##   Model Marka Cena.w.PLN Cena Waluta
## 1                   1600 1600    PLN
## 2                   2600 2600    PLN
## 3                   5800 5800    PLN
## 4                   6000 6000    PLN
## 5                   6499 6499    PLN
## 6                   7300 7300    PLN

Kategoryjne operatory potoków

Rozwiązaniem problemu cebulki jest stosowanie specjalnego operatora do przetwarzania potokowego %>%. Ten operator pochodzi z pakietu magrittr (cytując z jego dokumentacji: to be pronounced with a sophisticated french accent) i jest dostępny po włączeniu pakietu dplyr.

Instrukcja a %>% f(b) jest równoważna instrukcji f(a, b).

Można też opisać go następująco: Operator przekazuje lewą stronę jako pierwszy argument funkcji wskazanej z prawej strony.

auta2012 %>%                                    # weź dane o autach
  filter(Marka == "Volkswagen") %>%             # pozostaw tylko Volkswageny
  arrange(Cena.w.PLN) %>%                       # posortuj malejąco po cenie
  filter(Model == "Golf", Wersja == "IV") %>%   # pozostaw tylko Golfy VI
  filter(Przebieg.w.km < 50000) ->              # pozostaw tylko auta o małym przebiegu
  tylkoMalyPrzebieg

head(tylkoMalyPrzebieg[,1:9])
##   Cena Waluta Cena.w.PLN Brutto.netto  KM  kW      Marka Model Wersja
## 1 4800    PLN       4800       brutto 150 110 Volkswagen  Golf     IV
## 2 7500    PLN       7500       brutto  75  55 Volkswagen  Golf     IV
## 3 8000    PLN       8000       brutto 100  74 Volkswagen  Golf     IV
## 4 8300    PLN       8300       brutto  NA  NA Volkswagen  Golf     IV
## 5 8500    PLN       8500       brutto  75  55 Volkswagen  Golf     IV
## 6 8500    PLN       8500       brutto 100  74 Volkswagen  Golf     IV

Funkcje z pakietu dplyr są tak zdefiniowane by pierwszym argumentem był zawsze zbiór danych. Przez to domyślne zachowanie operatora %>% pozwala na taki skrótowy zapis.

Dla funkcji, które zbiór danych przyjmują jako drugi lub kolejny argument można miejsce gdzie należy wstawić lewą stronę operatora %>% wskazać symbolem ..

W poniższym przykładzie zbiór danych iris zostanie wstawiony do jako argument data= ponieważ to miejsce wskazuje symbol ..

iris %>%
  lm(Sepal.Length~Species, data=.) %>%
  coef
##       (Intercept) Speciesversicolor  Speciesvirginica 
##             5.006             0.930             1.582

Agregaty

Funkcją summarise() można wyznaczyć agregaty w danych.

Przykładowo, poniższa instrukcja dla zbioru danych auta2012 liczy średnią cenę, pierwiastek z wariancji ceny i medianę przebiegu aut.

auta2012 %>%
  summarise(sredniaCena = mean(Cena.w.PLN),
            sdCena = sqrt(var(Cena.w.PLN)),
            medianaPrzebiegu = median(Przebieg.w.km, na.rm=TRUE))
##   sredniaCena   sdCena medianaPrzebiegu
## 1    35755.11 70399.67           140000

Nie zawsze agregat związany jest z przekształceniem wartości w jakiejś kolumnie. Przykładowo, dosyć przydatną statystyką jest liczba wierszy, która nie zależy od wartości w danych. Taki agregat można wyznaczyć funkcją n().

Wyznaczając agregaty możemy składać funkcje. Przykładowo składając mean() i grepl() możemy policzyć procent aut z określonym elementem wyposażenia.

auta2012 %>%
  summarise(liczba.aut.z.klimatyzacja = sum(grepl("klimatyzacja", Wyposazenie.dodatkowe)),
            procent.aut.z.klimatyzacja = 100*mean(grepl("klimatyzacja", Wyposazenie.dodatkowe)),
            procent.aut.z.automatem = 100*mean(Skrzynia.biegow == "automatyczna"),
            liczba.aut = n())
##   liczba.aut.z.klimatyzacja procent.aut.z.klimatyzacja
## 1                    162960                   78.49635
##   procent.aut.z.automatem liczba.aut
## 1                16.32354     207602

Funkcja group_by() pozwala określić w jakich grupach mają być liczone agregaty wyznaczane przez funkcję summarise().

Sama funkcja nie powoduje żadnego przetwarzania, a jedynie dodaje znacznik określający co jest teraz zmienną grupującą. Kolejne funkcje w potoku (tj. summarise()) będą dzięki temu znacznikowi wiedziały, że statystyki należy wyznaczać w grupach.

Poniższy przykład liczy trzy statystyki (medianę ceny, przebiegu i liczbę wierszy) dla poszczególnych typów paliwa.

auta2012 %>%
  filter(Marka == "Volkswagen", Rok.produkcji == 2007) %>%
  group_by(Rodzaj.paliwa) %>%
  summarise(medianaCeny = median(Cena.w.PLN, na.rm=TRUE),
            medianaPrzebieg = median(Przebieg.w.km, na.rm=TRUE),
            liczba = n())
## # A tibble: 3 x 4
##   Rodzaj.paliwa          medianaCeny medianaPrzebieg liczba
##   <fct>                        <dbl>           <dbl>  <int>
## 1 benzyna                     33550            67000    190
## 2 benzyna+LPG                 34049.           95000      7
## 3 olej napedowy (diesel)      38900           145000   1482

Agregaty są zwykłą ramką danych, można wykonywać na nich kolejne operacje, np. sortowanie.

auta2012 %>%
  filter(Marka == "Volkswagen", Rok.produkcji == 2007) %>%
  group_by(Rodzaj.paliwa) %>%
  summarise(medianaCeny = median(Cena.w.PLN, na.rm=TRUE),
            medianaPrzebieg = median(Przebieg.w.km, na.rm=TRUE),
            liczba = n()) %>%
  arrange(liczba)
## # A tibble: 3 x 4
##   Rodzaj.paliwa          medianaCeny medianaPrzebieg liczba
##   <fct>                        <dbl>           <dbl>  <int>
## 1 benzyna+LPG                 34049.           95000      7
## 2 benzyna                     33550            67000    190
## 3 olej napedowy (diesel)      38900           145000   1482

I jeszcze jeden przykład:

auta2012 %>%
  filter(Rok.produkcji == 2007, Marka == "Volkswagen") %>%
  group_by(Model, Rodzaj.paliwa) %>%
  summarise(medianaCeny = median(Cena.w.PLN, na.rm=TRUE),
            medianaPrzebieg = median(Przebieg.w.km, na.rm=TRUE),
            liczba = n())
## # A tibble: 35 x 5
## # Groups:   Model [19]
##    Model     Rodzaj.paliwa          medianaCeny medianaPrzebieg liczba
##    <fct>     <fct>                        <dbl>           <dbl>  <int>
##  1 Beetle    benzyna                     39000           30000       1
##  2 Caddy     benzyna                     27900          170000       2
##  3 Caddy     olej napedowy (diesel)      30813          126906.     49
##  4 Caravelle olej napedowy (diesel)      65900          170000       9
##  5 Eos       benzyna                     53445           53000       6
##  6 Eos       olej napedowy (diesel)      64900           62000       7
##  7 Fox       benzyna                     15228.          69000      11
##  8 Fox       olej napedowy (diesel)      17000          137000       7
##  9 Golf      benzyna                     35900           70500      37
## 10 Golf      benzyna+LPG                 31650           99500       4
## # … with 25 more rows

ZADANIA

Aby zweryfikować znajomość pakietów dplyr i tidyr spróbuj rozwiązać poniższe 20 zadań. Kolejność odpowiada stopniowi trudności. Pierwsze zadania można rozwiązać stosując pojedyncze operacje, ostatnie wymagają połączenia większej liczby cegiełek.

Wszystkie one dotyczą zbioru danych auta2012 dostępnego w pakiecie PogromcyDanych.

  1. Która Marka występuje najczęściej w zbiorze danych auta2012?
  2. Spośród aut marki Toyota, który model występuje najczęściej.
  3. Sprawdź ile jest aut z silnikiem diesla wyprodukowanych w 2007 roku? 4.Jakiego koloru auta mają najmniejszy medianowy przebieg?
  4. Gdy ograniczyć się tylko do aut wyprodukowanych w 2007, która Marka występuje najczęściej w zbiorze danych auta2012?
  5. Spośród aut marki Toyota, który model najbardziej stracił na cenie pomiędzy rokiem produkcji 2007 a 2008.
  6. Spośród aut z silnikiem diesla wyprodukowanych w 2007 roku która marka jest najdroższa?
  7. Ile jest aut z klimatyzacją?
  8. Gdy ograniczyć się tylko do aut z silnikiem ponad 100 KM, która Marka występuje najczęściej w zbiorze danych auta2012?
  9. Spośród aut marki Toyota, który model ma największą różnicę cen gdy porównać silniki benzynowe a diesel?
  10. Spośród aut z silnikiem diesla wyprodukowanych w 2007 roku która marka jest najtańsza?
  11. W jakiej marce klimatyzacja jest najczęściej obecna?
  12. Gdy ograniczyć się tylko do aut o cenie ponad 50 000 PLN, która Marka występuje najczęściej w zbiorze danych auta2012?
  13. Spośród aut marki Toyota, który model ma największy medianowy przebieg?
  14. Spośród aut z silnikiem diesla wyprodukowanych w 2007 roku który model jest najdroższy?
  15. W jakim modelu klimatyzacja jest najczęściej obecna?
  16. Gdy ograniczyć się tylko do aut o przebiegu poniżej 50 000 km o silniku diesla, która Marka występuje najczęściej w zbiorze danych auta2012?
  17. Spośród aut marki Toyota wyprodukowanych w 2007 roku, który model jest średnio najdroższy?
  18. Spośród aut z silnikiem diesla wyprodukowanych w 2007 roku który model jest najtańszy?
  19. Jakiego koloru auta mają największy medianowy przebieg?

Podstawowe operacje programistyczne

W R możesz wykonywać wszystkie podstawowe operacje arytmetyczne.

1+1
## [1] 2
3^2
## [1] 9
sin(pi/2)
## [1] 1
sqrt(16)
## [1] 4
(1+5)*4
## [1] 24

Przypisywanie zmiennych

x <- 13
y <- 3

# sprawdz wartosc x
x
## [1] 13
x+y
## [1] 16
z <- x*y
q <- x^4*z

operatory porównania

x <= y
## [1] FALSE
# !!! pamiętaj = to nie to samo co ==
x == y
## [1] FALSE
x > y
## [1] TRUE

Struktury danych

W odróżnieniu od innych języków programowania w R podstawową strukturą danych jest wektor. (Jakie znasz podstawowe struktury w innych językach ?).

Wektor to sekwencja wartości tego samego typu (liczb, stringów, wartości logicznyc itp). Jedna liczba to wektor jednoelementowy.

Wektor tworzymy wykorzystując funkcję c() (ang. column)

# vector z liczb 1,2 oraz 3
c(1,2,3)
## [1] 1 2 3
# wektor z wartosciami tekstowymi
c("hello", "kolokwium",'zadanie')
## [1] "hello"     "kolokwium" "zadanie"

Wektory można tworzyć jako gotowe sekwencje.

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
-3:5
## [1] -3 -2 -1  0  1  2  3  4  5
seq(from=0, to=300, by=12)
##  [1]   0  12  24  36  48  60  72  84  96 108 120 132 144 156 168 180 192
## [18] 204 216 228 240 252 264 276 288 300
seq(1,2,length.out = 10)
##  [1] 1.000000 1.111111 1.222222 1.333333 1.444444 1.555556 1.666667
##  [8] 1.777778 1.888889 2.000000

Jakiego typu wartości otrzymamy jeżeli utworzymy następujący wektor ?

c(1, "napis", 4.21, TRUE)
## [1] "1"     "napis" "4.21"  "TRUE"

Podstawowe typy wektorów to:

  • logiczne TRUE oraz FALSE (wielkość liter ma znaczenie)
  • integer liczby całkowite
  • numeric liczby rzeczywiste
  • complex liczby zespolone
  • character tekst

Aby sprawdzić jakiego typu jest obiekt użyj metody class().

x <- 1:5
class(x)
## [1] "integer"
y <- c("aaa", "foo")
class(y)
## [1] "character"

Operacje na wetkorach

Aby sprawdzić ile elementów zawartych jest w wektorze korzystamy z metody length().

x
## [1] 1 2 3 4 5
length(x)
## [1] 5
y
## [1] "aaa" "foo"
length(y)
## [1] 2

Każdemu elementowi wektora można przypisać etykietę.

wzrost <- c(jan=178, pier=163, anna=157, john=198)

wzrost
##  jan pier anna john 
##  178  163  157  198
names(wzrost)
## [1] "jan"  "pier" "anna" "john"

Jeżeli mamy do dyspozycji dwa wektory:

x <- c(2,5,6,2,1)
y <- c(1,4,2,4,1)
x + y
## [1] 3 9 8 6 2
x < y
## [1] FALSE FALSE FALSE  TRUE FALSE
exp(-x^2) + cos(y)
## [1]  0.5586179 -0.6536436 -0.4161468 -0.6353280  0.9081817
# a co jeśli ? 
3+ x
## [1] 5 8 9 5 4
z <- c(2,3)
z + y
## Warning in z + y: longer object length is not a multiple of shorter object
## length
## [1] 3 7 4 7 3

Przydatne gotowe wektory

month.name
##  [1] "January"   "February"  "March"     "April"     "May"      
##  [6] "June"      "July"      "August"    "September" "October"  
## [11] "November"  "December"
LETTERS
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
## [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
letters
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"

Indeksowanie

LETTERS[4:9]
## [1] "D" "E" "F" "G" "H" "I"
letters[ c(1,5,8:12) ]
## [1] "a" "e" "h" "i" "j" "k" "l"

Jak wybrać co drugi element ?

# indeksy
co_drugi <- seq(from=1, to=length(LETTERS), by=2)
# wartosci
LETTERS[ co_drugi ]
##  [1] "A" "C" "E" "G" "I" "K" "M" "O" "Q" "S" "U" "W" "Y"

Wartości ujemne w indeksach wskazują, które elementy chcemy pominąć

month.name[ -(6:8)]
## [1] "January"   "February"  "March"     "April"     "May"       "September"
## [7] "October"   "November"  "December"

Możemy korzystać również z przypisanych nazw

wzrost <- c(jan=178, pier=163, anna=157, john=198)

wzrost[ c("jan", "anna") ]
##  jan anna 
##  178  157

Inną bardzo przydatną własnością jest możliwość zdefiniowania warunku logicznego

wzrost[ wzrost > 165]
##  jan john 
##  178  198

RAMKI DANYCH

?iris
# przykładowa ramka danych
data("iris")
# pierwsze 3 elemetny
head(iris,3)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
# the number of rows
nrow(iris)
## [1] 150
# the number of columns
ncol(iris)
## [1] 5
# both
dim(iris)
## [1] 150   5
# names of the columns
names(iris)
## [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width" 
## [5] "Species"
# summary
summary(iris)
##   Sepal.Length    Sepal.Width     Petal.Length    Petal.Width   
##  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100  
##  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300  
##  Median :5.800   Median :3.000   Median :4.350   Median :1.300  
##  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199  
##  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800  
##  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500  
##        Species  
##  setosa    :50  
##  versicolor:50  
##  virginica :50  
##                 
##                 
## 
# short summary
str(iris)
## 'data.frame':    150 obs. of  5 variables:
##  $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
##  $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
##  $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
##  $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

Indeksowanie Ramki Danych

Wiersze

iris[ c(1,4,5) , ]
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa

Kolumny

iris[ c(1,4,5) , 2:4]
##   Sepal.Width Petal.Length Petal.Width
## 1         3.5          1.4         0.2
## 4         3.1          1.5         0.2
## 5         3.6          1.4         0.2
iris[, "Sepal.Length"]
##   [1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8 4.3 5.8 5.7 5.4
##  [18] 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5
##  [35] 4.9 5.0 5.5 4.9 4.4 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0
##  [52] 6.4 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6 6.7 5.6 5.8
##  [69] 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7 6.0 5.7 5.5 5.5 5.8 6.0 5.4
##  [86] 6.0 6.7 6.3 5.6 5.5 5.5 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8
## [103] 7.1 6.3 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5 7.7 7.7
## [120] 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2 7.4 7.9 6.4 6.3 6.1 7.7
## [137] 6.3 6.4 6.0 6.9 6.7 6.9 5.8 6.8 6.7 6.7 6.3 6.5 6.2 5.9
iris[ iris[, "Sepal.Length"]<5, ]
##     Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
## 2            4.9         3.0          1.4         0.2     setosa
## 3            4.7         3.2          1.3         0.2     setosa
## 4            4.6         3.1          1.5         0.2     setosa
## 7            4.6         3.4          1.4         0.3     setosa
## 9            4.4         2.9          1.4         0.2     setosa
## 10           4.9         3.1          1.5         0.1     setosa
## 12           4.8         3.4          1.6         0.2     setosa
## 13           4.8         3.0          1.4         0.1     setosa
## 14           4.3         3.0          1.1         0.1     setosa
## 23           4.6         3.6          1.0         0.2     setosa
## 25           4.8         3.4          1.9         0.2     setosa
## 30           4.7         3.2          1.6         0.2     setosa
## 31           4.8         3.1          1.6         0.2     setosa
## 35           4.9         3.1          1.5         0.2     setosa
## 38           4.9         3.6          1.4         0.1     setosa
## 39           4.4         3.0          1.3         0.2     setosa
## 42           4.5         2.3          1.3         0.3     setosa
## 43           4.4         3.2          1.3         0.2     setosa
## 46           4.8         3.0          1.4         0.3     setosa
## 48           4.6         3.2          1.4         0.2     setosa
## 58           4.9         2.4          3.3         1.0 versicolor
## 107          4.9         2.5          4.5         1.7  virginica
iris[ iris[, "Sepal.Length"]<5, c("Sepal.Length","Species")]
##     Sepal.Length    Species
## 2            4.9     setosa
## 3            4.7     setosa
## 4            4.6     setosa
## 7            4.6     setosa
## 9            4.4     setosa
## 10           4.9     setosa
## 12           4.8     setosa
## 13           4.8     setosa
## 14           4.3     setosa
## 23           4.6     setosa
## 25           4.8     setosa
## 30           4.7     setosa
## 31           4.8     setosa
## 35           4.9     setosa
## 38           4.9     setosa
## 39           4.4     setosa
## 42           4.5     setosa
## 43           4.4     setosa
## 46           4.8     setosa
## 48           4.6     setosa
## 58           4.9 versicolor
## 107          4.9  virginica
iris$Sepal.Width
##   [1] 3.5 3.0 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 3.7 3.4 3.0 3.0 4.0 4.4 3.9
##  [18] 3.5 3.8 3.8 3.4 3.7 3.6 3.3 3.4 3.0 3.4 3.5 3.4 3.2 3.1 3.4 4.1 4.2
##  [35] 3.1 3.2 3.5 3.6 3.0 3.4 3.5 2.3 3.2 3.5 3.8 3.0 3.8 3.2 3.7 3.3 3.2
##  [52] 3.2 3.1 2.3 2.8 2.8 3.3 2.4 2.9 2.7 2.0 3.0 2.2 2.9 2.9 3.1 3.0 2.7
##  [69] 2.2 2.5 3.2 2.8 2.5 2.8 2.9 3.0 2.8 3.0 2.9 2.6 2.4 2.4 2.7 2.7 3.0
##  [86] 3.4 3.1 2.3 3.0 2.5 2.6 3.0 2.6 2.3 2.7 3.0 2.9 2.9 2.5 2.8 3.3 2.7
## [103] 3.0 2.9 3.0 3.0 2.5 2.9 2.5 3.6 3.2 2.7 3.0 2.5 2.8 3.2 3.0 3.8 2.6
## [120] 2.2 3.2 2.8 2.8 2.7 3.3 3.2 2.8 3.0 2.8 3.0 2.8 3.8 2.8 2.8 2.6 3.0
## [137] 3.4 3.1 3.0 3.1 3.1 3.1 2.7 3.2 3.3 3.0 2.5 3.0 3.4 3.0
iris$nowy <- iris$Sepal.Width*2

iris[ iris[, "Sepal.Length"]<5, c("Sepal.Length","nowy","Species")]
##     Sepal.Length nowy    Species
## 2            4.9  6.0     setosa
## 3            4.7  6.4     setosa
## 4            4.6  6.2     setosa
## 7            4.6  6.8     setosa
## 9            4.4  5.8     setosa
## 10           4.9  6.2     setosa
## 12           4.8  6.8     setosa
## 13           4.8  6.0     setosa
## 14           4.3  6.0     setosa
## 23           4.6  7.2     setosa
## 25           4.8  6.8     setosa
## 30           4.7  6.4     setosa
## 31           4.8  6.2     setosa
## 35           4.9  6.2     setosa
## 38           4.9  7.2     setosa
## 39           4.4  6.0     setosa
## 42           4.5  4.6     setosa
## 43           4.4  6.4     setosa
## 46           4.8  6.0     setosa
## 48           4.6  6.4     setosa
## 58           4.9  4.8 versicolor
## 107          4.9  5.0  virginica

Tworzenie ramki danych z wektorów

FamilyNamas <- c('Ojeciec', 'Matka','siostra','brat','pies')
FamilyAge <- c(53,52,15,8,3)
FamilySex <- c('M','F','F','M','F')
FamilyWeights <-c(92, 67, 45, 15, 3)

Family <- data.frame(FamilyNamas,FamilyAge, FamilySex,FamilyWeights)

str(Family)
## 'data.frame':    5 obs. of  4 variables:
##  $ FamilyNamas  : Factor w/ 5 levels "brat","Matka",..: 3 2 5 1 4
##  $ FamilyAge    : num  53 52 15 8 3
##  $ FamilySex    : Factor w/ 2 levels "F","M": 2 1 1 2 1
##  $ FamilyWeights: num  92 67 45 15 3
summary(Family)
##   FamilyNamas   FamilyAge    FamilySex FamilyWeights 
##  brat   :1    Min.   : 3.0   F:3       Min.   : 3.0  
##  Matka  :1    1st Qu.: 8.0   M:2       1st Qu.:15.0  
##  Ojeciec:1    Median :15.0             Median :45.0  
##  pies   :1    Mean   :26.2             Mean   :44.4  
##  siostra:1    3rd Qu.:52.0             3rd Qu.:67.0  
##               Max.   :53.0             Max.   :92.0
Family$FamilyAge
## [1] 53 52 15  8  3