R Language
dplyr
Szukaj…
Uwagi
dplyr to iteracja plyr, która zapewnia elastyczne funkcje oparte na czasownikach do manipulowania danymi w R. Najnowszą wersję dplyr można pobrać z CRAN przy użyciu
install.package("dplyr")
Kluczowym obiektem w dplyr jest tbl, reprezentacja tabelarycznej struktury danych. Obecnie dplyr (wersja 0.5.0) obsługuje:
- ramki danych
- tabele danych
- SQLite
- PostgreSQL / Redshift
- MySQL / MariaDB
- Bigquery
- MonetDB
- kostki danych z tablicami (częściowa implementacja)
czasowniki pojedynczej tabeli dplyr
dplyr wprowadza gramatykę manipulacji danymi w języku R
Zapewnia spójny interfejs do pracy z danymi bez względu na to, gdzie są przechowywane: data.frame , data.table lub database
. Kluczowe elementy dplyr
są pisane przy użyciu Rcpp , co czyni go bardzo szybkim do pracy z danymi w pamięci.
dplyr
jest posiadanie małych funkcji, które dobrze wykonują jedną rzecz. Pięć prostych funkcji ( filter
, arrange
, select
, mutate
i summarise
) można wykorzystać do ujawnienia nowych sposobów opisywania danych. W połączeniu z group_by
tych funkcji można używać do obliczania zbiorczych statystyk podsumowujących.
Wspólne cechy składniowe
Wszystkie te funkcje mają podobną składnię:
- Pierwszym argumentem dla wszystkich tych funkcji jest zawsze ramka danych
- Do kolumn można odwoływać się bezpośrednio, używając samych nagich zmiennych (tj. Bez użycia
$
) - Funkcje te nie modyfikują samych oryginalnych danych, tzn. Nie mają skutków ubocznych. Dlatego wyniki należy zawsze zapisywać w obiekcie.
Użyjemy wbudowanego zestawu danych mtcars do badania czasowników pojedynczej tabeli dplyr
. Przed konwersją typu mtcars
na tbl_df
(ponieważ sprawia, że drukowanie jest czystsze), dodajemy nazwy rownames
zestawu danych jako kolumny za pomocą funkcji rownames_to_column
z pakietu tibble .
library(dplyr) # This documentation was written using version 0.5.0
mtcars_tbl <- as_data_frame(tibble::rownames_to_column(mtcars, "cars"))
# examine the structure of data
head(mtcars_tbl)
# A tibble: 6 x 12
# cars mpg cyl disp hp drat wt qsec vs am gear carb
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Mazda RX4 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
#2 Mazda RX4 Wag 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
#3 Datsun 710 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
#4 Hornet 4 Drive 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#5 Hornet Sportabout 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
#6 Valiant 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
filtr
filter
pomaga w podzestawie wierszy spełniających określone kryteria. Pierwszy argument to nazwa data.frame
a drugi (i kolejne) argumenty to kryteria filtrujące dane (kryteria te powinny mieć wartość TRUE
lub FALSE
)
Podzestawuj wszystkie samochody, które mają 4 cylindry - cyl
:
filter(mtcars_tbl, cyl == 4)
# A tibble: 11 x 12
# cars mpg cyl disp hp drat wt qsec vs am gear carb
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
#2 Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#3 Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
#4 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#5 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
# ... with 6 more rows
Możemy przekazać wiele kryteriów oddzielonych przecinkiem. Aby podzestawić samochody, które mają 4 lub 6 cylindrów - cyl
i mają 5 biegów - gear
:
filter(mtcars_tbl, cyl == 4 | cyl == 6, gear == 5)
# A tibble: 3 x 12
# cars mpg cyl disp hp drat wt qsec vs am gear carb
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.7 0 1 5 2
#2 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.9 1 1 5 2
#3 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.5 0 1 5 6
filter
wybiera wiersze na podstawie kryteriów, aby wybrać wiersze według pozycji, użyj slice
. slice
przyjmuje tylko 2 argumenty: pierwszy to data.frame
a drugi to liczby całkowite w wierszu.
Aby wybrać wiersze od 6 do 9:
slice(mtcars_tbl, 6:9)
# A tibble: 4 x 12
# cars mpg cyl disp hp drat wt qsec vs am gear carb
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Valiant 18.1 6 225.0 105 2.76 3.46 20.22 1 0 3 1
#2 Duster 360 14.3 8 360.0 245 3.21 3.57 15.84 0 0 3 4
#3 Merc 240D 24.4 4 146.7 62 3.69 3.19 20.00 1 0 4 2
#4 Merc 230 22.8 4 140.8 95 3.92 3.15 22.90 1 0 4 2
Lub:
slice(mtcars_tbl, -c(1:5, 10:n()))
Daje to taki sam wynik jak slice(mtcars_tbl, 6:9)
n()
reprezentuje liczbę obserwacji w bieżącej grupie
zorganizować
arrange
służy do sortowania danych według określonych zmiennych. Podobnie jak poprzedni czasownik (i wszystkie inne funkcje w dplyr
), pierwszym argumentem jest data.frame
, a data.frame
argumenty są używane do sortowania danych. W przypadku przekazania więcej niż jednej zmiennej dane są najpierw sortowane według pierwszej zmiennej, a następnie według drugiej zmiennej itd.
Aby zamówić dane według mocy - hp
arrange(mtcars_tbl, hp)
# A tibble: 32 x 12
# cars mpg cyl disp hp drat wt qsec vs am gear carb
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#2 Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
#3 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#4 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#5 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#6 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
# ... with 26 more rows
Aby arrange
dane według mil na galon - mpg
w kolejności malejącej, a następnie liczbę cylindrów - cyl
:
arrange(mtcars_tbl, desc(mpg), cyl)
# A tibble: 32 x 12
# cars mpg cyl disp hp drat wt qsec vs am gear carb
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
#2 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
#3 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
#4 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
#5 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
#6 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
# ... with 26 more rows
Wybierz
select
służy do wybrania tylko podzbioru zmiennych. Aby wybrać tylko mpg
, disp
, wt
, qsec
i vs
z mtcars_tbl
:
select(mtcars_tbl, mpg, disp, wt, qsec, vs)
# A tibble: 32 x 5
# mpg disp wt qsec vs
# <dbl> <dbl> <dbl> <dbl> <dbl>
#1 21.0 160.0 2.620 16.46 0
#2 21.0 160.0 2.875 17.02 0
#3 22.8 108.0 2.320 18.61 1
#4 21.4 258.0 3.215 19.44 1
#5 18.7 360.0 3.440 17.02 0
#6 18.1 225.0 3.460 20.22 1
# ... with 26 more rows
:
notacji można używać do wybierania kolejnych kolumn. Aby wybrać kolumny od cars
przez disp
i vs
przez carb
:
select(mtcars_tbl, cars:disp, vs:carb)
# A tibble: 32 x 8
# cars mpg cyl disp vs am gear carb
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Mazda RX4 21.0 6 160.0 0 1 4 4
#2 Mazda RX4 Wag 21.0 6 160.0 0 1 4 4
#3 Datsun 710 22.8 4 108.0 1 1 4 1
#4 Hornet 4 Drive 21.4 6 258.0 1 0 3 1
#5 Hornet Sportabout 18.7 8 360.0 0 0 3 2
#6 Valiant 18.1 6 225.0 1 0 3 1
# ... with 26 more rows
lub select(mtcars_tbl, -(hp:qsec))
W przypadku zestawów danych zawierających kilka kolumn wybranie kilku kolumn według nazwy może być żmudne. Aby ułatwić życie, istnieje wiele funkcji pomocniczych (takich jak starts_with()
, ends_with()
, contains()
, matches()
, num_range()
, one_of()
i everything()
), których można użyć w select
. Aby dowiedzieć się więcej o tym, jak z nich korzystać, zobacz ?select_helpers
i ?select
.
Uwaga : Odnosząc się do kolumn bezpośrednio w select()
, używamy nagich nazw kolumn, ale należy używać cudzysłowów w odniesieniu do kolumn w funkcjach pomocniczych.
Aby zmienić nazwę kolumn podczas wybierania:
select(mtcars_tbl, cylinders = cyl, displacement = disp)
# A tibble: 32 x 2
# cylinders displacement
# <dbl> <dbl>
#1 6 160.0
#2 6 160.0
#3 4 108.0
#4 6 258.0
#5 8 360.0
#6 6 225.0
# ... with 26 more rows
Zgodnie z oczekiwaniami spowoduje to usunięcie wszystkich innych zmiennych.
Aby zmienić nazwę kolumn bez upuszczania innych zmiennych, użyj rename
:
rename(mtcars_tbl, cylinders = cyl, displacement = disp)
# A tibble: 32 x 12
# cars mpg cylinders displacement hp drat wt qsec vs
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0
#2 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0
#3 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1
#4 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1
#5 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0
#6 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1
# ... with 26 more rows, and 3 more variables: am <dbl>, gear <dbl>, carb <dbl>
zmutować
mutate
można wykorzystać do dodania nowych kolumn do danych. Podobnie jak wszystkie inne funkcje w dplyr
, dplyr
nie dodaje nowo utworzonych kolumn do oryginalnych danych. Kolumny są dodawane na końcu data.frame
.
mutate(mtcars_tbl, weight_ton = wt/2, weight_pounds = weight_ton * 2000)
# A tibble: 32 x 14
# cars mpg cyl disp hp drat wt qsec vs am gear carb weight_ton weight_pounds
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4 1.3100 2620
#2 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4 1.4375 2875
#3 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1 1.1600 2320
#4 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1 1.6075 3215
#5 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2 1.7200 3440
#6 Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1 1.7300 3460
# ... with 26 more rows
Zwróć uwagę na użycie weight_ton
podczas tworzenia weight_pounds
. W przeciwieństwie do bazy R
mutate
pozwala nam odwoływać się do kolumn, które właśnie utworzyliśmy, do użycia w kolejnej operacji.
Aby zachować tylko nowo utworzone kolumny, użyj opcji transmute
zamiast mutate
:
transmute(mtcars_tbl, weight_ton = wt/2, weight_pounds = weight_ton * 2000)
# A tibble: 32 x 2
# weight_ton weight_pounds
# <dbl> <dbl>
#1 1.3100 2620
#2 1.4375 2875
#3 1.1600 2320
#4 1.6075 3215
#5 1.7200 3440
#6 1.7300 3460
# ... with 26 more rows
podsumować
summarise
oblicza statystyki podsumowujące zmiennych poprzez zwijanie wielu wartości do jednej wartości. Może obliczyć wiele statystyk i możemy nazwać te kolumny podsumowań w tym samym zestawieniu.
Aby obliczyć średnią i odchylenie standardowe mpg
i disp
wszystkich samochodów w zbiorze danych:
summarise(mtcars_tbl, mean_mpg = mean(mpg), sd_mpg = sd(mpg),
mean_disp = mean(disp), sd_disp = sd(disp))
# A tibble: 1 x 4
# mean_mpg sd_mpg mean_disp sd_disp
# <dbl> <dbl> <dbl> <dbl>
#1 20.09062 6.026948 230.7219 123.9387
Grupuj według
group_by
może służyć do wykonywania operacji grupowych na danych. Gdy czasowniki zdefiniowane powyżej zostaną zastosowane do danych zgrupowanych, zostaną one automatycznie zastosowane do każdej grupy osobno.
Aby znaleźć mean
i sd
z mpg
przez cyl
:
by_cyl <- group_by(mtcars_tbl, cyl)
summarise(by_cyl, mean_mpg = mean(mpg), sd_mpg = sd(mpg))
# A tibble: 3 x 3
# cyl mean_mpg sd_mpg
# <dbl> <dbl> <dbl>
#1 4 26.66364 4.509828
#2 6 19.74286 1.453567
#3 8 15.10000 2.560048
Łącząc to wszystko razem
Wybieramy kolumny od cars
przez hp
i gear
, porządkujemy rzędy po cyl
i od najwyższego do najniższego mpg
, mpg
dane według gear
, a na końcu podzbiór tylko te samochody mają mpg
> 20 i hp
> 75
selected <- select(mtcars_tbl, cars:hp, gear)
ordered <- arrange(selected, cyl, desc(mpg))
by_cyl <- group_by(ordered, gear)
filter(by_cyl, mpg > 20, hp > 75)
Source: local data frame [9 x 6]
Groups: gear [3]
# cars mpg cyl disp hp gear
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Lotus Europa 30.4 4 95.1 113 5
#2 Porsche 914-2 26.0 4 120.3 91 5
#3 Datsun 710 22.8 4 108.0 93 4
#4 Merc 230 22.8 4 140.8 95 4
#5 Toyota Corona 21.5 4 120.1 97 3
# ... with 4 more rows
Może nie jesteśmy zainteresowani wynikami pośrednimi, możemy osiągnąć taki sam wynik jak powyżej, zawijając wywołania funkcji:
filter(
group_by(
arrange(
select(
mtcars_tbl, cars:hp
), cyl, desc(mpg)
), cyl
),mpg > 20, hp > 75
)
Może to być trochę trudne do odczytania. Tak więc operacje dplyr
można łączyć za pomocą operatora potoku %>%
. Powyższy kod przekłada się na:
mtcars_tbl %>%
select(cars:hp) %>%
arrange(cyl, desc(mpg)) %>%
group_by(cyl) %>%
filter(mpg > 20, hp > 75)
podsumuj wiele kolumn
dplyr
zapewnia summarise_all()
do zastosowania funkcji do wszystkich (nie grupujących) kolumn.
Aby znaleźć liczbę różnych wartości dla każdej kolumny:
mtcars_tbl %>%
summarise_all(n_distinct)
# A tibble: 1 x 12
# cars mpg cyl disp hp drat wt qsec vs am gear carb
# <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 32 25 3 27 22 22 29 30 2 2 3 6
Aby znaleźć liczbę różnych wartości dla każdej kolumny według cyl
:
mtcars_tbl %>%
group_by(cyl) %>%
summarise_all(n_distinct)
# A tibble: 3 x 12
# cyl cars mpg disp hp drat wt qsec vs am gear carb
# <dbl> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1 4 11 9 11 10 10 11 11 2 2 3 2
#2 6 7 6 5 4 5 6 7 2 2 3 3
#3 8 14 12 11 9 11 13 14 1 2 2 4
Zauważ, że po prostu musieliśmy dodać instrukcję group_by
, a reszta kodu jest taka sama. Dane wyjściowe składają się teraz z trzech wierszy - po jednym dla każdej unikalnej wartości cyl
.
Aby summarise
określone wiele kolumn, użyj summarise_at
mtcars_tbl %>%
group_by(cyl) %>%
summarise_at(c("mpg", "disp", "hp"), mean)
# A tibble: 3 x 4
# cyl mpg disp hp
# <dbl> <dbl> <dbl> <dbl>
#1 4 26.66364 105.1364 82.63636
#2 6 19.74286 183.3143 122.28571
#3 8 15.10000 353.1000 209.21429
funkcje helper
( ?select_helpers
) mogą być używane zamiast nazw kolumn do wybierania określonych kolumn
Aby zastosować wiele funkcji, przekaż nazwy funkcji jako wektor znaków:
mtcars_tbl %>%
group_by(cyl) %>%
summarise_at(c("mpg", "disp", "hp"),
c("mean", "sd"))
lub owiń je w funs
:
mtcars_tbl %>%
group_by(cyl) %>%
summarise_at(c("mpg", "disp", "hp"),
funs(mean, sd))
# A tibble: 3 x 7
# cyl mpg_mean disp_mean hp_mean mpg_sd disp_sd hp_sd
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 26.66364 105.1364 82.63636 4.509828 26.87159 20.93453
#2 6 19.74286 183.3143 122.28571 1.453567 41.56246 24.26049
#3 8 15.10000 353.1000 209.21429 2.560048 67.77132 50.97689
Nazwy kolumn są teraz dołączane do nazw funkcji, aby je odróżnić. Aby to zmienić, podaj nazwę, która ma zostać dołączona do funkcji:
mtcars_tbl %>%
group_by(cyl) %>%
summarise_at(c("mpg", "disp", "hp"),
c(Mean = "mean", SD = "sd"))
mtcars_tbl %>%
group_by(cyl) %>%
summarise_at(c("mpg", "disp", "hp"),
funs(Mean = mean, SD = sd))
# A tibble: 3 x 7
# cyl mpg_Mean disp_Mean hp_Mean mpg_SD disp_SD hp_SD
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 26.66364 105.1364 82.63636 4.509828 26.87159 20.93453
#2 6 19.74286 183.3143 122.28571 1.453567 41.56246 24.26049
#3 8 15.10000 353.1000 209.21429 2.560048 67.77132 50.97689
Aby warunkowo wybrać kolumny, użyj summarise_if
:
Weź mean
wszystkich kolumn, które są pogrupowane numeric
według cyl
:
mtcars_tbl %>%
group_by(cyl) %>%
summarise_if(is.numeric, mean)
# A tibble: 3 x 11
# cyl mpg disp hp drat wt qsec
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727
#2 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714
#3 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214
# ... with 4 more variables: vs <dbl>, am <dbl>, gear <dbl>,
# carb <dbl>
Jednak niektóre zmienne są dyskretne, a mean
tych zmiennych nie ma sensu.
Aby przyjąć mean
tylko zmiennych ciągłych według cyl
:
mtcars_tbl %>%
group_by(cyl) %>%
summarise_if(function(x) is.numeric(x) & n_distinct(x) > 6, mean)
# A tibble: 3 x 7
# cyl mpg disp hp drat wt qsec
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 4 26.66364 105.1364 82.63636 4.070909 2.285727 19.13727
#2 6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714
#3 8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214
Obserwacja podzbioru (wiersze)
dplyr::filter()
- Wybierz podzbiór wierszy w ramce danych, które spełniają logiczne kryteria:
dplyr::filter(iris,Sepal.Length>7)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1 7.1 3.0 5.9 2.1 virginica
# 2 7.6 3.0 6.6 2.1 virginica
# 3 7.3 2.9 6.3 1.8 virginica
# 4 7.2 3.6 6.1 2.5 virginica
# 5 7.7 3.8 6.7 2.2 virginica
# 6 7.7 2.6 6.9 2.3 virginica
# 7 7.7 2.8 6.7 2.0 virginica
# 8 7.2 3.2 6.0 1.8 virginica
# 9 7.2 3.0 5.8 1.6 virginica
# 10 7.4 2.8 6.1 1.9 virginica
# 11 7.9 3.8 6.4 2.0 virginica
# 12 7.7 3.0 6.1 2.3 virginica
dplyr::distinct()
- Usuń zduplikowane wiersze:
distinct(iris, Sepal.Length, .keep_all = TRUE)
# 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
# 4 4.6 3.1 1.5 0.2 setosa
# 5 5.0 3.6 1.4 0.2 setosa
# 6 5.4 3.9 1.7 0.4 setosa
# 7 4.4 2.9 1.4 0.2 setosa
# 8 4.8 3.4 1.6 0.2 setosa
# 9 4.3 3.0 1.1 0.1 setosa
# 10 5.8 4.0 1.2 0.2 setosa
# 11 5.7 4.4 1.5 0.4 setosa
# 12 5.2 3.5 1.5 0.2 setosa
# 13 5.5 4.2 1.4 0.2 setosa
# 14 4.5 2.3 1.3 0.3 setosa
# 15 5.3 3.7 1.5 0.2 setosa
# 16 7.0 3.2 4.7 1.4 versicolor
# 17 6.4 3.2 4.5 1.5 versicolor
# 18 6.9 3.1 4.9 1.5 versicolor
# 19 6.5 2.8 4.6 1.5 versicolor
# 20 6.3 3.3 4.7 1.6 versicolor
# 21 6.6 2.9 4.6 1.3 versicolor
# 22 5.9 3.0 4.2 1.5 versicolor
# 23 6.0 2.2 4.0 1.0 versicolor
# 24 6.1 2.9 4.7 1.4 versicolor
# 25 5.6 2.9 3.6 1.3 versicolor
# 26 6.7 3.1 4.4 1.4 versicolor
# 27 6.2 2.2 4.5 1.5 versicolor
# 28 6.8 2.8 4.8 1.4 versicolor
# 29 7.1 3.0 5.9 2.1 virginica
# 30 7.6 3.0 6.6 2.1 virginica
# 31 7.3 2.9 6.3 1.8 virginica
# 32 7.2 3.6 6.1 2.5 virginica
# 33 7.7 3.8 6.7 2.2 virginica
# 34 7.4 2.8 6.1 1.9 virginica
# 35 7.9 3.8 6.4 2.0 virginica
Agregowanie za pomocą operatora%>% (potok)
Rura (%>%) podmiot może być stosowany w połączeniu z dplyr
funkcji. W tym przykładzie używamy zestawu danych mtcars
(zobacz help("mtcars")
aby uzyskać więcej informacji), aby pokazać, jak podsumować ramkę danych i dodać zmienne do danych w wyniku zastosowania funkcji.
library(dplyr)
library(magrittr)
df <- mtcars
df$cars <- rownames(df) #just add the cars names to the df
df <- df[,c(ncol(df),1:(ncol(df)-1))] # and place the names in the first column
1. Sumuj dane
Do obliczenia statystyk wykorzystujemy summarize
i odpowiednie funkcje. W tym przypadku n()
służy do zliczania liczby przypadków.
df %>%
summarize(count=n(),mean_mpg = mean(mpg, na.rm = TRUE),
min_weight = min(wt),max_weight = max(wt))
# count mean_mpg min_weight max_weight
#1 32 20.09062 1.513 5.424
2. Oblicz statystyki według grup
Możliwe jest obliczenie statystyk według grup danych. W tym przypadku według liczby cylindrów i liczby biegów do przodu
df %>%
group_by(cyl, gear) %>%
summarize(count=n(),mean_mpg = mean(mpg, na.rm = TRUE),
min_weight = min(wt),max_weight = max(wt))
# Source: local data frame [8 x 6]
# Groups: cyl [?]
#
# cyl gear count mean_mpg min_weight max_weight
# <dbl> <dbl> <int> <dbl> <dbl> <dbl>
#1 4 3 1 21.500 2.465 2.465
#2 4 4 8 26.925 1.615 3.190
#3 4 5 2 28.200 1.513 2.140
#4 6 3 2 19.750 3.215 3.460
#5 6 4 4 19.750 2.620 3.440
#6 6 5 1 19.700 2.770 2.770
#7 8 3 12 15.050 3.435 5.424
#8 8 5 2 15.400 3.170 3.570
Przykłady NSE i zmiennych łańcuchowych w dpylr
dplyr
używa oceny niestandardowej (NSE), dlatego zwykle możemy używać nazw zmiennych bez cudzysłowów. Jednak czasami podczas potoku danych musimy uzyskać nazwy zmiennych z innych źródeł, takich jak Błyszczące pole wyboru. W przypadku funkcji takich jak select
, możemy po prostu użyć select_
aby wybrać zmienną łańcuchową
variable1 <- "Sepal.Length"
variable2 <- "Sepal.Width"
iris %>%
select_(variable1, variable2) %>%
head(n=5)
# Sepal.Length Sepal.Width
# 1 5.1 3.5
# 2 4.9 3.0
# 3 4.7 3.2
# 4 4.6 3.1
# 5 5.0 3.6
Ale jeśli chcemy korzystać z innych funkcji, takich jak podsumowaniu bądź filtra musimy użyć interp
funkcji z lazyeval
pakietu
variable1 <- "Sepal.Length"
variable2 <- "Sepal.Width"
variable3 <- "Species"
iris %>%
select_(variable1, variable2, variable3) %>%
group_by_(variable3) %>%
summarize_(mean1 = lazyeval::interp(~mean(var), var = as.name(variable1)), mean2 = lazyeval::interp(~mean(var), var = as.name(variable2)))
# Species mean1 mean2
# <fctr> <dbl> <dbl>
# 1 setosa 5.006 3.428
# 2 versicolor 5.936 2.770
# 3 virginica 6.588 2.974