Anche se l'obiettivo di questi post rimane sempre quello di fornire gli strumenti più semplici, quelli utili nella fase iniziale di apprendimento – notoriamente tutta in salita e nella quale quello che conta è "rompere il ghiaccio" con R – occasionalmente può essere interessante affrontare argomenti un poco più tecnici, come i due che vediamo ora.
Il primo riguarda l'operatore pipe indicato con il simbolo %>%: il termine sta per il sostantivo "tubo" ma anche per l'espressione verbale "trasportare con una tubatura", ed è proprio in questo senso che viene impiegato. L'operatore pipe è stato introdotto la prima volta con il pacchetto magrittr [1] che ne riporta la seguente descrizione:
"[il pacchetto] fornisce un meccanismo per concatenare i comandi con il nuovo operatore di inoltro pipe, %>%. Questo operatore inoltrerà un valore, o il risultato di un'espressione, alla successiva chiamata/espressione di funzione. [l'operatore] fornisce un supporto flessibile per il tipo di espressioni sul lato destro. Per ulteriori informazioni, consultare la descrizione del pacchetto. Per citare René Magritte, 'Ceci n'est pas une pipe'. " [2]
Più sinteticamente: l'operatore %>% fornisce la "tubatura" che consente di inoltrare i dati in uscita da una funzione all'ingresso della funzione che segue. Vediamo questo breve esempio. Abbiamo il set di dati ais [3]
> ais
rcc wcc hc hg ferr bmi ssf pcBfat lbm ht wt sex sport
1 3.96 7.5 37.5 12.3 60 20.56 109.1 19.75 63.32 195.9 78.9 f B_Ball
…...
202 5.38 6.3 46.0 15.7 32 21.07 34.9 6.26 72.00 190.8 76.7 m Tennis
e vogliamo calcolare la media, la deviazione standard e l'errore standard della concentrazione di emoglobina (hg) nel sangue dei 202 atleti australiani ivi inclusi suddividendoli per sport praticato (sport) e per sesso (sex).
Copiate e incollate nella Console di R questo script e premete ↵ Invio.
# COME IMPIEGARE l'operatore %>% (pipe)
#
library (DAAG) # carica il pacchetto che include il set di dati ais
library(dplyr) # carica il pacchetto con l'operatore pipe e altre funzioni
library(plotrix) # carica il pacchetto per il calcolo dell'errore standard
#
# calcola media, deviazione standard ed errore standard separatamente per sport e per sesso
#
pipe_hg <- ais %>% group_by(sport, sex) %>% summarise(media=mean(hg), ds=sd(hg), es=std.error(hg)) %>% ungroup()
#
pipe_hg # mostra i risultati
#
Dopo avere installato e caricato i pacchetti necessari, per realizzare la tabella che contiene i risultati desiderati impieghiamo l'operatore pipe (%>%) che trasferisce i dati da una funzione alla successiva in questo modo:
→ i dati (ais) sono trasferiti (%>%) alla funzione group_by();
→ la funzione group_by() raggruppa i dati in sottoinsiemi per sport praticato (sport) e per sesso dell'atleta (sex) e il risultato di questa operazione viene trasferito (%>%) alla funzione summarise();
→ la funzione summarise() calcola la media mean(), la deviazione standard sd() e l'errore standard std.error() della variabile hg – la concentrazione nel sangue dell'emoglobina (espressa in g/dL, grammi per decilitro di sangue) dei 202 atleti australiani suddivisi per sport e per sesso – e il risultato viene trasferito (%>%) alla funzione ungroup();
→ la funzione ungroup() rimuove una serie di valori impiegati provvisoriamente per generare il risultato finale che viene salvato (<-) nella tabella pipe_hg.
Ed ecco la tabella risultante, ottenuta quindi con una sola riga di codice:
> pipe_hg # mostra i risultati
# A tibble: 17 × 5
sport sex media ds es
<fct> <fct> <dbl> <dbl> <dbl>
1 B_Ball f 13.1 0.878 0.243
2 B_Ball m 15.1 0.922 0.266
3 Field f 14.6 0.682 0.258
4 Field m 16.0 0.805 0.232
5 Gym f 13.6 0.860 0.430
6 Netball f 12.8 0.567 0.118
7 Row f 14.0 0.740 0.158
8 Row m 15.4 0.711 0.184
9 Swim f 13.6 0.583 0.194
10 Swim m 15.5 0.655 0.182
11 T_400m f 13.8 1.04 0.312
12 T_400m m 15.3 0.824 0.194
13 T_Sprnt f 14.2 0.556 0.278
14 T_Sprnt m 16.2 1.49 0.450
15 Tennis f 13.5 1.10 0.414
16 Tennis m 15.6 1.48 0.741
17 W_Polo m 15.5 0.718 0.174
Il secondo riguarda l'argomento FUN che consente di specificare una o più funzioni e di applicarle in sequenza a una variabile. Impieghiamo gli stessi dati dell'esempio precedente allo stesso scopo: calcolare la media, la deviazione standard e l'errore standard della concentrazione di emoglobina nel sangue di 202 atleti australiani suddividendoli per sport praticato e per sesso.
Copiate e incollate nella Console di R questo script e premete ↵ Invio.
# COME IMPIEGARE l'argomento FUN
#
library (DAAG) # carica il pacchetto che include il set di dati ais
library(plotrix) # carica il pacchetto per il calcolo dell'errore standard
#
# calcola media, deviazione standard ed errore standard separatamente per sport e per sesso
#
FUN_hg <- aggregate(hg~sport+sex, data=ais, FUN=function(x) c(media=mean(x), ds=sd(x), es=std.error(x)))
#
FUN_hg # mostra i risultati
#
Dopo avere installato e caricato i pacchetti necessari, la tabella che contiene i risultati desiderati viene realizzata con la funzione aggregate() che nell'ordine:
→ nel nostro set di dati (data=ais) raggruppa (~) i valori di concentrazione dell'emoglobina (hg) in sottoinsiemi per sport praticato (sport) e per sesso dell'atleta (sex);
→ con l'argomento FUN e con il valore =function(x) specifica che sui dati devono essere effettuati i calcoli di seguito elencati;
→ con la funzione c() elenca le funzioni da impiegare per i calcoli;
→ con le funzioni mean(), sd() e std.error() effettua i calcoli di media, deviazione standard ed errore standard sui dati raggruppati per sport e per sesso, salvando i risultati nelle variabili media, ds ed es.
I risultati sono infine riportati (<-) nella tabella FUN_hg e, a parte l'ordinamento e gli arrotondamenti, sono identici a quelli ottenuti con lo script precedente, impiegando anche in questo caso una sola riga di codice.
> FUN_hg # mostra i risultati
sport sex hg.media hg.ds hg.es
1 B_Ball f 13.1307692 0.8778616 0.2434750
2 Field f 14.6285714 0.6824326 0.2579353
3 Gym f 13.6000000 0.8602325 0.4301163
4 Netball f 12.8173913 0.5670114 0.1182301
5 Row f 14.0318182 0.7396179 0.1576871
6 Swim f 13.5666667 0.5830952 0.1943651
7 T_400m f 13.7727273 1.0354621 0.3122036
8 T_Sprnt f 14.1750000 0.5560276 0.2780138
9 Tennis f 13.5285714 1.0965313 0.4144499
10 B_Ball m 15.1416667 0.9219134 0.2661335
11 Field m 16.0250000 0.8046738 0.2322893
12 Row m 15.3866667 0.7110020 0.1835799
13 Swim m 15.5076923 0.6550592 0.1816807
14 T_400m m 15.3055556 0.8235306 0.1941080
15 T_Sprnt m 16.1909091 1.4936228 0.4503442
16 Tennis m 15.6500000 1.4821156 0.7410578
17 W_Polo m 15.5176471 0.7178399 0.1741017
Conclusione: nel corso dell'elaborazione dei dati può essere utile tenere a portata di mano qualche esempio di codice, come questi due, che ricorda come impiegare l'operatore %>% e l'argomento FUN. Non trovate molto altro sul web, ma potete provare ricercando ad esempio "R %>% operator examples" o "R FUN function examples".
-----------
[1] Vedere il Reference manual del pacchetto: Package ‘magrittr’.
https://cran.r-project.org/web/packages/magrittr/magrittr.pdf
[2] "Provides a mechanism for chaining commands with a new forward-pipe operator, %>%. This operator will forward a value, or the result of an expression, into the next function call/expression. There is flexible support for the type of right-hand side expressions. For more information, see package vignette. To quote Rene Magritte, 'Ceci n'est pas un pipe.' ".
[3] Vedere il post Il set di dati ais nel quale trovate anche come caricare i dati senza impiegare il pacchetto DAAG.