domenica 20 luglio 2025

Come impiegare l'operatore %>% e l'argomento FUN

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=aisraggruppa (~) 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

Nessun commento:

Posta un commento