Install R https://cran.r-project.org/bin/windows/base/ (latest version 3.5.2, 2018-12-20)
Install R Studio https://www.rstudio.com/products/rstudio/download/ (latest 1.1.463, 2018-10-29)
Sprawdzenie wersji (R or 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
# 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
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.
Zadanie 2 Za pomocą
Import Dataset
wczytaj dane z excela.
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ą
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
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
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 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
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
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
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.
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
x <- 13
y <- 3
# sprawdz wartosc x
x
## [1] 13
x+y
## [1] 16
z <- x*y
q <- x^4*z
x <= y
## [1] FALSE
# !!! pamiętaj = to nie to samo co ==
x == y
## [1] FALSE
x > y
## [1] TRUE
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łkowitenumeric
liczby rzeczywistecomplex
liczby zespolonecharacter
tekstAby sprawdzić jakiego typu jest obiekt użyj metody class()
.
x <- 1:5
class(x)
## [1] "integer"
y <- c("aaa", "foo")
class(y)
## [1] "character"
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
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"
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
?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 ...
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
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