dplyr
library(dplyr)
%>% działa jak pipe w bashu
przekazywany wynik jest brany jako pierwszy argument nowej funkcji lub jako pierwszy nienazwany
%>% jest operatorem specyficznym dla biblioteki dplyr
, nie działa bez załadowania jej
Wybierz zmienne (kolumny): select
Wybierz obserwacje (wiersze) wg warunku: filter
Wybierz obserwacje (wiersze) wg indeksów: slice
Ułóż w porządku (posortuj): arrange
Dodaj / zmień istniejącą kolumnę: mutate
Bardziej zaawansowane: group_by
, summarise
(patrz przykłady na dole)
Działają też rozmaite inne funkcje, które już poznaliśmy, np.:
Wyświetl kilka pierwszych wierszy: head
Policz wiersze: nrow
Daj tylko unikatowe wartości: unique
usuń obserwacje z NA: na.omit
…i masa innych.
Ściąga: https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
Daj tylko kolumny Species
i Sepal.Length
z tabeli iris
.
iris %>%
select("Species", "Sepal.Length")
Species <fctr> | Sepal.Length <dbl> | |||
---|---|---|---|---|
setosa | 5.1 | |||
setosa | 4.9 | |||
setosa | 4.7 | |||
setosa | 4.6 | |||
setosa | 5.0 | |||
setosa | 5.4 | |||
setosa | 4.6 | |||
setosa | 5.0 | |||
setosa | 4.4 | |||
setosa | 4.9 |
Daj tylko wiersze, w których Petal.Width
jest większe niż dwa, i policz ile tak wyfiltrowane dane mają wierszy.
iris %>%
filter(Petal.Width > 2) %>%
nrow()
## Warning: package 'bindrcpp' was built under R version 3.4.4
## [1] 23
Daj tylko te kwiaty, które mają Sepal.Width
mniejsze niż 4 i nie są setosą. Ułóż je wg Petal.Length
. Wyświetl tylko kilka pierwszych wierszy.
iris %>%
filter(Sepal.Width < 4 & Species != "setosa") %>%
arrange(Petal.Length) %>%
head()
Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fctr> | |
---|---|---|---|---|---|
1 | 5.1 | 2.5 | 3.0 | 1.1 | versicolor |
2 | 4.9 | 2.4 | 3.3 | 1.0 | versicolor |
3 | 5.0 | 2.3 | 3.3 | 1.0 | versicolor |
4 | 5.0 | 2.0 | 3.5 | 1.0 | versicolor |
5 | 5.7 | 2.6 | 3.5 | 1.0 | versicolor |
6 | 5.6 | 2.9 | 3.6 | 1.3 | versicolor |
Policz, w ilu gatunkach (nie osobnikach!) zdarza się, że jakikolwiek kwiatek ma Sepal.Length
mniejsze niż 4.5.
iris %>%
filter(Sepal.Length < 4.5) %>%
select(Species) %>%
unique() %>%
nrow()
## [1] 1
Dodaj kolumnę z pomnożonymi długością i szerokością płatka. Zapisz nową macierz na nową zmienną.
iris %>%
mutate(iloczyn = Petal.Length * Petal.Width) -> nowe_irysy
# lub:
nowe_irysy <- iris %>%
mutate(iloczyn = Petal.Length * Petal.Width)
Wybierz tylko kwiaty virginica i zbuduj z nich model liniowy, który przewidzi długość płatków na podstawie ich szerokości.
iris %>%
filter(Species == "virginica") %>%
lm(formula = Petal.Length ~ Petal.Width)
##
## Call:
## lm(formula = Petal.Length ~ Petal.Width, data = .)
##
## Coefficients:
## (Intercept) Petal.Width
## 4.2407 0.6473
# przekazane dane beda teraz wziete jako pierwszy nienazwany argument funkcji lm
# czyli data
Policz, ile jest kwiatów poszczególnych gatunków.
iris %>%
group_by(Species) %>%
summarize(ile = n())
Species <fctr> | ile <int> | |||
---|---|---|---|---|
setosa | 50 | |||
versicolor | 50 | |||
virginica | 50 |
Policz średnią szerokość i długość płatka dla każdego z gatunków. Dodaj kolumnę z iloczynem tych dwóch wartości. Wybierz tylko wersy, dla których ten iloczyn jest różny od 13 lub gatunek jest równy “virginica”.
iris %>%
group_by(Species) %>%
mutate(srednia.dlugosc = mean(Petal.Length),
srednia.szerokosc = mean(Petal.Width)) %>%
mutate(iloczyn = srednia.dlugosc * srednia.szerokosc) %>%
filter(iloczyn != 13 | Species == "virginica") %>%
head()
Sepal.Length <dbl> | Sepal.Width <dbl> | Petal.Length <dbl> | Petal.Width <dbl> | Species <fctr> | srednia.dlugosc <dbl> | |
---|---|---|---|---|---|---|
5.1 | 3.5 | 1.4 | 0.2 | setosa | 1.462 | |
4.9 | 3.0 | 1.4 | 0.2 | setosa | 1.462 | |
4.7 | 3.2 | 1.3 | 0.2 | setosa | 1.462 | |
4.6 | 3.1 | 1.5 | 0.2 | setosa | 1.462 | |
5.0 | 3.6 | 1.4 | 0.2 | setosa | 1.462 | |
5.4 | 3.9 | 1.7 | 0.4 | setosa | 1.462 |