Visualizzazione post con etichetta FUN. Mostra tutti i post
Visualizzazione post con etichetta FUN. Mostra tutti i post

martedì 12 novembre 2024

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

Anche se l'obiettivo di questi post rimane sempre quello di fornire gli strumenti più semplici per "rompere il ghiaccio" con R, occasionalmente può essere interessante affrontare argomenti un poco più tecnici, come i due che vediamo oggi.

Il primo riguarda l'operatore indicato con il simbolo %>% che si legge "pipe": 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 è 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 un pipe'. " [2]

Più sinteticamente: l'operatore %>% mette a disposizione una "tubatura" di collegamento attraverso la quale i dati in uscita da una funzione sono "trasportati" in ingresso alla 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 e per sesso.

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 suddivisione 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 [1] suddivisi per sport e per sesso – e il risultato viene salvato (<-) nella tabella pipe_hg;
→ i risultati sono trasferiti (%>%) alla funzione ungroup() che rimuove dalla struttura della tabella pipe_hg una serie di valori impiegati provvisoriamente per generarla.

Ed ecco la tabella risultante:

> 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 argomento riguarda l'argomento FUN che consente di specificare una o più funzioni e 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:
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 di applicare alla variabile le funzioni successivamente elencate;
 con la funzione c() elenca le statistiche da calcolare;
 con le funzioni mean(), sd() e std.error() calcola la media, la deviazione standard e  l'errore standard per sport e per sesso, salvandone i valori nelle variabili media, ds ed es

I risultati sono infine salvati (<-) nella tabella FUN_hg e, a parte l'ordinamento, sono identici a quelli ottenuti con lo script precedente.

> 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 questi esempi di impiego dell'operatore %>% e dell'argomento FUN per sperimentare il loro possibile utilizzo. Ma potete trovare altri esempi sul web 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