16.4 Operace nad sloupci
Funkce z balíku dplyr umožňují spouštět funkce nad specifikovanými sloupci tabulky. Prvním příkladem užití takové funkcionality může být výběr sloupců určitého datového typu:
%>%
planes select(where(is.character))
## # A tibble: 3,322 × 5
## tailnum type manufacturer model engine
## <chr> <chr> <chr> <chr> <chr>
## 1 N10156 Fixed wing multi engine EMBRAER EMB-145XR Turbo-fan
## 2 N102UW Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## 3 N103US Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## 4 N104UW Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## 5 N10575 Fixed wing multi engine EMBRAER EMB-145LR Turbo-fan
## 6 N105UW Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## 7 N107US Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## 8 N108UW Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## 9 N109UW Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## 10 N110UW Fixed wing multi engine AIRBUS INDUSTRIE A320-214 Turbo-fan
## # … with 3,312 more rows
Výběr byl proveden s použitím dodatečné select-helper funce where()
. Do té byl vložen výraz, který byl vyhodnocen nad sloupci tabulky. Výsledek, logický vektor, byl potom použit pro výběr funkcí select()
.
Všiměte si, že funkce is.character()
je v příkladu použita bez závorek. Parametrem where()
je totiž funkce samotná a nikoliv její výstup.
dplyr umožňuje uživateli provádět i sofistikovanější operace – typicky modifikovat sloupce, které splňují určitou podmínku. Můžeme například chtít konvertovat číselné sloupce na character
. Pro tyto účely slouží funkce across()
. Ta má dva vstupy: (a) výraz, který identifikuje sloupce, které se mají modifikovat, a (b) výraz, který se má pro samotnou modifikaci použít. řešení by mohlo vypadat následujícím způsobem:
%>%
planes mutate(
across(
where(is.numeric),
as.character
) )
## # A tibble: 3,322 × 9
## tailnum year type manufacturer model engines seats speed engine
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 N10156 2004 Fixed wing m… EMBRAER EMB-1… 2 55 <NA> Turbo-…
## 2 N102UW 1998 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## 3 N103US 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## 4 N104UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## 5 N10575 2002 Fixed wing m… EMBRAER EMB-1… 2 55 <NA> Turbo-…
## 6 N105UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## 7 N107US 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## 8 N108UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## 9 N109UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## 10 N110UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 <NA> Turbo-…
## # … with 3,312 more rows
Funkce across()
funguje výborně s funkcemi jako je mutate()
nebo summarise()
. V dplyr 1.0.4 přibyly nové funkce, které jsou navženy tak, aby podobným způsobem umožnili pracovat s filter()
. Jde o if_any()
a if_all()
. Jejich syntaxe a parametry jsou stejné jako u across()
, ale na ro rozdíl od across()
vracejí logický vektor, který je požadovaným vstupem funkce filter()
.
Následující příklad ukazuje, jak řešit obyvklý problém v datové analýze – někde nám utíkají pozorování, protože některé řádky v nějakém sloupci obsahují NA
. Funkce if_any()
nám umožňuje takové řádky lehce najít:
%>%
planes filter(
if_any(
everything(), # tj. hledej ve všech sloupcích
is.na
) )
## # A tibble: 3,299 × 9
## tailnum year type manufacturer model engines seats speed engine
## <chr> <int> <chr> <chr> <chr> <int> <int> <int> <chr>
## 1 N10156 2004 Fixed wing m… EMBRAER EMB-1… 2 55 NA Turbo-…
## 2 N102UW 1998 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## 3 N103US 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## 4 N104UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## 5 N10575 2002 Fixed wing m… EMBRAER EMB-1… 2 55 NA Turbo-…
## 6 N105UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## 7 N107US 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## 8 N108UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## 9 N109UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## 10 N110UW 1999 Fixed wing m… AIRBUS INDUST… A320-… 2 182 NA Turbo-…
## # … with 3,289 more rows
Funkce across()
, where()
, if_any()
a if_all()
nahrazují tzv. scoped varianty základních funkcí ze starších verzí dplyr.