Vai al contenuto principale

Tutorial sulla famiglia Apply di R

In questo tutorial imparerai l'uso delle funzioni apply in R, le sue varianti e alcuni dei suoi parenti applicati a diverse strutture dati.
Aggiornato 29 set 2026  · 14 min leggi

Scopri con l'IA

ChatGPTClaudePerplexity

banner learn r

Una nota sulla famiglia Apply di R

La famiglia Apply di R è un insieme di funzioni in R che permettono di applicare una funzione agli elementi di un vettore, lista o matrice. Tuttavia, è considerata funzionalità legacy e non dovrebbe essere usata per nuovo codice. Al suo posto, si consiglia di usare il pacchetto purrr per tutti i loop in R. Il pacchetto purrr offre una sintassi coerente per lavorare con funzioni che accettano input e output multipli, rendendo più facile scrivere e leggere il codice. Inoltre, purrr mette a disposizione una suite di funzioni ottimizzate per ambienti di calcolo moderni, risultando più veloce ed efficiente rispetto alla famiglia Apply. In generale, sebbene la famiglia Apply di R possa ancora funzionare per alcune applicazioni, è consigliabile usare il pacchetto purrr per tutti i nuovi progetti R.

Le funzioni Apply come alternative ai loop

Questo post ti mostrerà come usare la funzione R apply(), le sue varianti come mapply() e alcuni dei “parenti” di apply(), applicati a diverse strutture dati. Ovviamente, non tutte le varianti possono essere discusse, ma quando possibile ti verrà presentato l’uso di queste funzioni in cooperazione, tramite un paio di esempi un po’ più sostanziosi.

Potresti anche trovare utile dare un’occhiata a questo corso introduttivo a R per capire meglio liste, vettori, array e dataframe, anche se non è necessario aver completato il tutorial per seguire questo post!

La famiglia apply()

La famiglia apply() fa parte del pacchetto base di R ed è composta da funzioni per manipolare porzioni di dati da matrici, array, liste e dataframe in modo ripetitivo. Queste funzioni permettono di attraversare i dati in vari modi ed evitano l’uso esplicito di costrutti di loop. Agiscono su una lista, una matrice o un array di input e applicano una funzione specificata con uno o più argomenti opzionali.

La funzione chiamata può essere:

  • Una funzione di aggregazione, come ad esempio media o somma (che restituiscono un numero o scalare);
  • Altre funzioni di trasformazione o di subsetting; e
  • Altre funzioni vettorializzate, che producono strutture più complesse come liste, vettori, matrici e array.

Le funzioni apply() costituiscono la base di combinazioni più complesse e aiutano a eseguire operazioni con pochissime righe di codice. Più nello specifico, la famiglia è composta dalle funzioni apply(), lapply() , sapply(), vapply(), mapply(), rapply() e tapply().

Ma come e quando dovremmo usarle?

Dipende dalla struttura dei dati su cui vuoi operare e dal formato dell’output di cui hai bisogno.

Come usare apply() in R

Iniziamo con il capostipite della famiglia, apply(), che opera sugli array. Per semplicità, il tutorial si limita agli array 2D, noti anche come matrici.

Il manuale base di R indica che si chiama così: apply(X, MARGIN, FUN, ...)

dove:

  • X è un array o una matrice se la dimensione dell’array è 2;
  • MARGIN è una variabile che definisce come viene applicata la funzione: quando MARGIN=1, si applica sulle righe, mentre con MARGIN=2 lavora sulle colonne. Nota che usando la costruzione MARGIN=c(1,2), si applica sia a righe che a colonne; e
  • FUN è la funzione che vuoi applicare ai dati. Può essere qualsiasi funzione R, inclusa una UDF (User Defined Function).

Ora, i principianti potrebbero avere difficoltà a visualizzare cosa succede, quindi un’immagine e un po’ di codice torneranno utili per capirlo.

Costruiamo una matrice 5 x 6 e immaginiamo di voler sommare i valori di ciascuna colonna.

Puoi scrivere qualcosa del genere:

# Construct a 5 x 6 matrix
my_matrix <- matrix(1:30, nrow = 5, ncol = 6)

# Calculate the sum of each column
col_sums <- apply(my_matrix, 2, sum)

# Print the result
print(col_sums)

La funzione matrix() crea una matrice 5 x 6 con valori da 1 a 30. Usiamo poi la funzione apply() per applicare la funzione sum() a ciascuna colonna della matrice (2 specifica che vogliamo applicare la funzione alle colonne). Il vettore risultante con le somme per colonna viene salvato nella variabile col_sums e stampato in console.

Ricorda che in R una matrice può essere vista come una raccolta di vettori riga quando la attraversi dall’alto verso il basso (lungo la dimensione o margine 1), oppure come un elenco di vettori colonna, attraversando la matrice da sinistra a destra lungo la dimensione o margine 2.

Questo significa che l’istruzione che hai appena inserito, illustrata in figura 1, si traduce in: “applica la funzione ‘sum’ alla matrice X lungo il margine 2 (per colonna), sommando i valori di ciascuna colonna”.

Nota che, per non affollare l’immagine, solo una delle colonne è evidenziata.

Ottieni un vettore riga contenente le somme dei valori di ciascuna colonna.

L’output del codice sopra, un vettore riga, sarebbe stato restituito anche se avessi sommato lungo le righe della matrice. È così che R mostra il risultato.

Una nota per quanto segue: nella maggior parte dei casi R può restituire un valore anche se questo non è stato specificato, o più precisamente se il valore di ritorno della funzione non è stato assegnato a una variabile. R restituisce semplicemente l’ultimo oggetto valutato. In pratica, però, quando vuoi controllare il valore restituito e quando devi effettuare ulteriori operazioni su quei valori, è meglio assegnare esplicitamente i risultati di una data funzione a una variabile.

La funzione lapply()

Vuoi applicare una determinata funzione a ogni elemento di una lista e ottenere come risultato una lista. Se esegui ?lapply, vedrai che la sintassi assomiglia a quella di apply().

La differenza è che:

  1. Può essere usata per altri oggetti come dataframe, liste o vettori; e
  2. L’output restituito è una lista (il che spiega la “l” nel nome della funzione), che ha lo stesso numero di elementi dell’oggetto passato.

Per vedere come funziona, crea alcune matrici ed estrai da ciascuna una determinata colonna.

Questa è un’operazione piuttosto comune sui dati reali quando si fanno confronti o aggregazioni da dataframe diversi.

Il nostro esempio giocattolo, illustrato in figura 2, può essere codificato così:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKSIsInNhbXBsZSI6IiMgQ3JlYXRlIGEgbGlzdCBvZiBtYXRyaWNlc1xuTXlMaXN0IDwtIGxpc3QoQSxCLEMpXG5cbiMgRXh0cmFjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGBNeUxpc3RgIHdpdGggdGhlIHNlbGVjdGlvbiBvcGVyYXRvciBgW2Agd2l0aCBgbGFwcGx5KClgXG4uLi4uLi4oTXlMaXN0LFwiW1wiLCAsIDIpXG5cbiMgRXh0cmFjdCB0aGUgMXN0IHJvdyBmcm9tIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCApIiwic29sdXRpb24iOiIjIENyZWF0ZSBhIGxpc3Qgb2YgbWF0cmljZXNcbk15TGlzdCA8LSBsaXN0KEEsQixDKVxuXG4jIEV4dHJhY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBgTXlMaXN0YCB3aXRoIHRoZSBzZWxlY3Rpb24gb3BlcmF0b3IgYFtgIHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgLCAyKVxuXG4jIEV4dHJhY3QgdGhlIDFzdCByb3cgZnJvbSBgTXlMaXN0YFxubGFwcGx5KE15TGlzdCxcIltcIiwgMSwgKSIsInNjdCI6InRlc3Rfb2JqZWN0KFwiTXlMaXN0XCIpXG50ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIsIGluZGV4ID0gMSlcbnRlc3RfZnVuY3Rpb24oXCJsYXBwbHlcIiwgaW5kZXggPSAyKVxudGVzdF9lcnJvcigpXG5zdWNjZXNzX21zZyhcIkF3ZXNvbWUhXCIpIn0=

funzioni lapply vs apply

L’operazione è mostrata nella parte sinistra della figura 2.

Di nuovo, inizi specificando l’oggetto di interesse, la lista Mylist. Usi l’operatore di selezione standard di R [ e poi ometti il primo parametro (che quindi si traduce in “qualsiasi”, ecco perché vedi le due virgole).

Poi specifichi il secondo parametro, che è 2: il nostro margine è “colonna”. Quindi estrai la seconda colonna da tutte le matrici all’interno della lista.

Alcune note sul codice sopra:

  • La notazione [ è l’operatore di selezione. Ricorda, ad esempio, che per estrarre tutti gli elementi della terza riga di B serve: B[3,];
  • La notazione [[ ]] indica che stiamo lavorando con liste: [[2]] significa il secondo elemento della lista. Questo è mostrato anche nell’output restituito da R;
  • L’output è una lista con tanti elementi quanti quelli in input; e
  • Nota che avresti potuto estrarre anche un singolo elemento per ciascuna matrice, così: lapply(MyList,"[", 1, 2)

Nella parte destra della figura 2, puoi vedere un’estrazione alternativa: questa volta ometti il primo parametro e ottieni la prima riga da ciascuna delle matrici.

Provalo tu! Seleziona la seconda colonna da ogni matrice nella lista:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBVc2UgYGxhcHBseSgpYCB0byBzZWxlY3QgdGhlIDJuZCBjb2x1bW4gZnJvbSBlYWNoIG1hdHJpeCBpbiBgTXlMaXN0YFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMSwpIiwic29sdXRpb24iOiIjIFVzZSBgbGFwcGx5KClgIHRvIHNlbGVjdCB0aGUgMm5kIGNvbHVtbiBmcm9tIGVhY2ggbWF0cml4IGluIGBNeUxpc3RgXG5sYXBwbHkoTXlMaXN0LFwiW1wiLCAxLCkiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwibGFwcGx5XCIpXG50ZXN0X2Vycm9yKClcbnN1Y2Nlc3NfbXNnKFwiV2VsbCBkb25lIVwiKSJ9

La funzione sapply()

La funzione sapply() funziona come lapply(), ma prova a semplificare l’output alla struttura dati più elementare possibile. In effetti, sapply() è una funzione “wrapper” per lapply().

Un esempio può aiutare a capire: supponiamo di voler ripetere l’operazione di estrazione di un singolo elemento come nell’ultimo esempio, ma ora prendere il primo elemento della seconda riga (indici 2 e 1) per ciascuna matrice.

Applicare la funzione lapply() ci darebbe una lista, a meno che tu non passi simplify=FALSE come parametro a sapply(). In tal caso verrà restituita una lista. Vedi come funziona nel blocco di codice qui sotto:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBSZXR1cm4gYSBsaXN0IHdpdGggYGxhcHBseSgpYFxubGFwcGx5KE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHNhcHBseSgpYFxuLi4uLi4uKE15TGlzdCxcIltcIiwgMiwgMSApXG5cbiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBzYXBwbHkoKWBcbi4uLi4uLihNeUxpc3QsXCJbXCIsIDIsIDEsIHNpbXBsaWZ5PUYpXG5cbiMgUmV0dXJuIGEgdmVjdG9yIHdpdGggYHVubGlzdCgpYFxuLi4uLi4uKGxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKSkiLCJzb2x1dGlvbiI6IiMgUmV0dXJuIGEgbGlzdCB3aXRoIGBsYXBwbHkoKWBcbmxhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGBzYXBwbHkoKWBcbnNhcHBseShNeUxpc3QsXCJbXCIsIDIsIDEgKVxuXG4jIFJldHVybiBhIGxpc3Qgd2l0aCBgc2FwcGx5KClgXG5zYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxLCBzaW1wbGlmeT1GKVxuXG4jIFJldHVybiBhIHZlY3RvciB3aXRoIGB1bmxpc3QoKWBcbnVubGlzdChsYXBwbHkoTXlMaXN0LFwiW1wiLCAyLCAxICkpIiwic2N0IjoidGVzdF9mdW5jdGlvbihcImxhcHBseVwiKVxudGVzdF9mdW5jdGlvbihcInNhcHBseVwiLCBpbmRleCA9IDEpXG50ZXN0X2Z1bmN0aW9uKFwic2FwcGx5XCIsIGluZGV4PSAyKVxudGVzdF9mdW5jdGlvbihcInVubGlzdFwiLCBcInhcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Al contrario, una funzione come unlist() può istruire lappy() a restituire un vettore!

In ogni caso, per evitare confusione è meglio usare queste funzioni nel loro “formato nativo” ed evitare conversioni se non strettamente necessarie.

La funzione rep()

Qualcosa che spesso si usa insieme alle funzioni apply() è rep(). Applicata a un vettore o a un fattore x, la funzione replica i suoi valori un numero specificato di volte.

Usiamo uno dei vettori che hai generato sopra con lapply() dentro MyList.

Questa volta, però, selezioni solo gli elementi della prima riga e della prima colonna da ciascun elemento della lista MyList (e usi sapply() per ottenere un vettore):

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6IkEgPC0gbWF0cml4KDE6OSwgMywzKVxuQiA8LSBtYXRyaXgoNDoxNSwgNCwzKVxuQyA8LSBtYXRyaXgoODoxMCwgMywyKVxuTXlMaXN0IDwtIGxpc3QoQSxCLEMpIiwic2FtcGxlIjoiIyBJbml0aWFsaXplIGBaYFxuWiA8LSBzYXBwbHkoTXlMaXN0LFwiW1wiLCAxLDEgKVxuXG4jIFJldHVybiBgWmBcblpcblxuIyBSZXBsaWNhdGUgdGhlIHZhbHVlcyBvZiBgWmBcblogPC0gcmVwKFosYygzLDEsMikpXG5cbiMgUmV0dXJuIGBaYFxuWiJ9

Vedi che il codice sopra replica i valori di Z un numero di volte stabilito da c(3,1,2): tre volte il primo, una volta il secondo e due volte il terzo.

Comodo, no?

La funzione mapply()

La funzione mapply() sta per “multivariate” apply. Il suo scopo è poter vettorializzare gli argomenti di una funzione che di solito non accetta vettori come argomenti.

In breve, mapply() applica una funzione a più liste o a più vettori come argomenti.

Vediamo un esempio con mapply() in cui crei una matrice 4 x 4 con chiamate ripetute alla funzione rep():

eyJsYW5ndWFnZSI6InIiLCJzYW1wbGUiOiIjIENyZWF0ZSBhIDR4NCBtYXRyaXhcblExIDwtIC4uLi4uLihjKHJlcCgxLCA0KSwgcmVwKDIsIDQpLCByZXAoMywgNCksIHJlcCg0LCA0KSksNCw0KVxuXG4jIFByaW50IGBRMWBcbi4uLi4uKFExKVxuXG4jIE9yIHVzZSBgbWFwcGx5KClgXG5RMiA8LSAuLi4uLi4ocmVwLDE6NCw0KVxuXG4jIFByaW50IGBRMmBcbnByaW50KFEyKSIsInNvbHV0aW9uIjoiIyBDcmVhdGUgYSA0eDQgbWF0cml4XG5RMSA8LSBtYXRyaXgoYyhyZXAoMSwgNCksIHJlcCgyLCA0KSwgcmVwKDMsIDQpLCByZXAoNCwgNCkpLDQsNClcblxuIyBQcmludCBgUTFgXG5wcmludChRMSlcblxuIyBPciB1c2UgYG1hcHBseSgpYFxuUTIgPC0gbWFwcGx5KHJlcCwxOjQsNClcblxuIyBQcmludCBgUTJgXG5wcmludChRMikiLCJzY3QiOiJ0ZXN0X29iamVjdChcIlExXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWF0cml4KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hdHJpeCgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MSwgaW5jb3JyZWN0X21zZz1cIkRpZCB5b3UgYWRkIGBwcmludCgpYCB0byB0aGUgY29kZT9cIiwgdW5kZWZpbmVkX21zZz1cIkRpZCB5b3UgZm9yZ2V0IHRvIGFkZCBgcHJpbnQoKWAgdG8gdGhlIGNvZGU/XCIpXG50ZXN0X29iamVjdChcIlEyXCIsIGluY29ycmVjdF9tc2c9XCJEaWQgeW91IGFkZCBgbWFwcGx5KClgIHRvIHRoZSBjb2RlP1wiLCB1bmRlZmluZWRfbXNnPVwiRGlkIHlvdSBhZGQgYG1hcHBseSgpYCB0byB0aGUgY29kZT9cIilcbnRlc3RfZnVuY3Rpb24oXCJwcmludFwiLCBcInhcIiwgaW5kZXg9MikifQ==

Ma si vede che c’è un modo più efficiente per concatenare i risultati di rep() invece che con c(): quando chiami mapply(), vettorializzi l’azione della funzione rep().

La funzione aggregate()

Questa funzione è contenuta nel pacchetto stats e si usa così: aggregate(x, by, FUN, ..., simplify = TRUE).

In altre parole, funziona in modo simile alla funzione apply(): specifichi l’oggetto, la funzione e indichi se vuoi semplificare, proprio come con la funzione sapply(). La differenza fondamentale è l’uso della clausola by, che imposta la variabile o il campo del dataframe in base al quale vogliamo effettuare l’aggregazione.

La sezione successiva mostrerà come funziona.

Un esempio di aggregate()

Considera il dataset di esempio chiamato Mydf, che contiene dati sulle vendite di un prodotto e in cui alcuni dei valori della colonna DepPC si ripetono.

Questa variabile classifica i dati su una località geografica, come la porzione di un CAP (qui i numeri corrispondono ai dipartimenti dell’Île-de-France, la regione che comprende Parigi).

Vuoi fare un po’ di statistiche sulle colonne delle vendite. Queste sono DProgr, un numero progressivo in ordine temporale crescente, e le vendite del prodotto (la quantità Qty), più una variabile logica, Delivered, che indica se il prodotto è stato consegnato (T) o no (F).

Per prima cosa, puoi fare alcune cose molto semplici per familiarizzare con il dataset, oltre a mostrarlo tutto digitandone semplicemente il nome (qui abbiamo solo 120 record, ma immagina di farlo per un file reale con migliaia di righe!).

Esploriamo i dati:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG4uLi4uKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG4uLi4uKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbi4uLihNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzb2x1dGlvbiI6IiMgRXhwbG9yZSB0aGUgZmlyc3QgMTUgcmVjb3JkcyB3aXRoIGBoZWFkKClgXG5oZWFkKE15ZGYsMTUpXG5cbiMgU2VlIHRoZSBsYXN0IDUgcmVjb3JkcyB3aXRoIGB0YWlsKClgXG50YWlsKE15ZGYsNSkgXG5cbiMgU2hvdyBkYXRhIHR5cGVzIGZvciBlYWNoIGNvbHVtblxuc2FwcGx5KE15ZGYsIGNsYXNzKVxuXG4jIFJldHVybiBudW1iZXIgb2Ygcm93cyBhbmQgY29sdW1ucyB3aXRoIGBkaW0oKWBcbmRpbShNeWRmKSBcblxuIyBIb3cgbWFueSBkZXBhcnRtZW50cz8gXG51bmlxdWUoTXlkZiREZXBQQykiLCJzY3QiOiJ0ZXN0X2Z1bmN0aW9uKFwiaGVhZFwiKVxudGVzdF9mdW5jdGlvbihcInRhaWxcIilcbnRlc3RfZnVuY3Rpb24oXCJzYXBwbHlcIilcbnRlc3RfZnVuY3Rpb24oXCJkaW1cIilcbnRlc3RfZnVuY3Rpb24oXCJ1bmlxdWVcIilcbnRlc3RfZXJyb3IoKVxuc3VjY2Vzc19tc2coXCJHb29kIGpvYiFcIikifQ==

Nota che se vuoi vedere il numero di righe e colonne contenute nel dataframe, avresti potuto anche chiamare nrow(Mydf) e ncol(Mydf).

Molte altre interrogazioni sui dati sono possibili.

Qui, ad esempio, ti interessa sapere in quale dipartimento il prodotto vende meglio. Per questo dovresti raggruppare i dati per dipartimento, sommando le vendite, Qty, per ciascun dipartimento DepPC con l’aiuto della funzione aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6ImFnZ3JlZ2F0ZShNeWRmJFF0eSwgYnk9TXlkZltcIkRlcFBDXCJdLCBGVU49c3VtKSJ9

Quindi, aggregate() dice a R che vuoi sommare tutte le Qty appartenenti allo stesso dipartimento.

Nota che R ha assegnato la somma a una variabile ‘x’ perché non hai specificato diversamente.

L’output è piuttosto leggibile così com’è, ma con un numero più elevato di dipartimenti potrebbe esserlo meno. In questi casi, puoi ricorrere a un output grafico: tracci i risultati usando uno dei sistemi grafici di R insieme alla funzione aggregate():

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKSIsInNhbXBsZSI6IiMgTG9hZCBpbiBgZ2dwbG90MmBcbmxpYnJhcnkoZ2dwbG90MilcblxuIyBQbG90IHRoZSBzYWxlcyBwZXIgZGVwYXJ0bWVudFxuZ2dwbG90KGRhdGE9YWdncmVnYXRlKE15ZGYkUXR5LGJ5PU15ZGZbXCJEZXBQQ1wiXSxGVU49c3VtKSwgYWVzKHg9RGVwUEMsIHk9eCkpICtcbiAgZ2VvbV9wb2ludCgpK1xuICBnZ3RpdGxlKFwiU2FsZXMgcGVyIGRlcGFydG1lbnQgLSBBbGxcIikifQ==

Questo ci fornisce le vendite per ciascun dipartimento.

Potresti farti la stessa domanda, ma solo per la merce consegnata. Per farlo, prima fai il subset dei dati per i quali delivered è vero (T) usando l’ormai familiare operatore di subsetting "[".

Nota che qui assegni il risultato a una nuova variabile Y, che è un nuovo dataframe che eredita gli stessi nomi di colonna dal dataframe padre Mydf. Lo fai per evitare di ripetere l’istruzione di aggregazione all’interno della chiamata al plotting per leggibilità:

eyJsYW5ndWFnZSI6InIiLCJwcmVfZXhlcmNpc2VfY29kZSI6Ik15ZGYgPC0gZGF0YS5mcmFtZShEZXBQQz1jKFwiOTBcIixcIjkxXCIsXCI5MlwiLFwiOTNcIixcIjk0XCIsXCI3NVwiKSwgRFByb2dyPWMoMToxMjApLCBRdHk9Yyg3OjMxLDk6MjMsOTk6MTI0LDI6MjgsMTQ6MTksMjE6MjksNCwzLDE6OSw2NiksIERlbGl2ZXJlZD1pZmVsc2Uocm5vcm0oMTIwKT4wLFRSVUUsRkFMU0UpKVxubGlicmFyeShnZ3Bsb3QyKSIsInNhbXBsZSI6IiMgc2VsZWN0IG9ubHkgZm9yIGRlbGl2ZXJlZD1UcnVlXG5ZIDwtIE15ZGZbTXlkZiREZWxpdmVyZWQ9PVRSVUUsXVxuXG4jIFBsb3QgdGhlIHNhbGVzIGJ5IGRlcGFydG1lbnRcbmdncGxvdChkYXRhPWFnZ3JlZ2F0ZShZJFF0eSxieT1ZW1wiRGVwUENcIl0sRlVOPXN1bSksIGFlcyh4PURlcFBDLCB5PXgpKSArXG4gIGdlb21fcG9pbnQoKStcbiAgZ2d0aXRsZShcIlNhbGVzIHBlciBkZXBhcnRtZW50IC0gRGVsaXZlcmVkXCIpIn0=

Quindi avresti potuto porre domande diverse ai dati in modo vettorializzato come con aggregate(), e spesso lo fai in congiunzione con un comodo sistema di plotting come ggplot2, quindi hai colto il senso.

Nota che per ottenere questo ti sono bastate pochissime righe di codice.

Vettorializzazione come alternativa a loop e funzioni Apply?

Hai visto alcune variazioni sullo stesso tema, ovvero “agire su un insieme strutturato di dati in modo ripetitivo”. In questo senso, queste funzioni possono essere viste non solo come un’alternativa ai loop ma anche come una forma vettorializzata di operare.

“Vettorializzata” qui in senso lato, senza entrare nel dibattito se – e quali tra le – funzioni apply() siano davvero vettorializzate o meno (vedi ad esempio la discussione qui).

In pratica, per scegliere quale funzione apply() usare, devi considerare quanto segue:

  • Il tipo di dato dell’input: è l’oggetto su cui agirai (vettore, matrice, array…, lista, data frame o magari una combinazione di questi)
  • Cosa intendi fare: la funzione FUN che vuoi passare
  • I sottoinsiemi di quei dati: righe, colonne, o magari tutti?
  • Che tipo di dato vuoi ottenere dalla funzione? Perché potresti volerci eseguire ulteriori operazioni (e vuoi un nuovo oggetto, o trasformare direttamente l’oggetto di input?)

Queste sono domande piuttosto generali che puoi porre per le funzioni correlate, tra cui abbiamo considerato aggregate(), by(), sweep(), ecc.

Ma ce ne sono molte altre! Non fermarti qui! Dai un’occhiata al tutorial di DataCamp su Array in R.

Come seguito a questo tutorial, valuta di seguire i corsi di DataCamp Introduction to R o Intermediate R.

Argomenti
R
Data Science

Scopri di più su R

{count, plural, one {Corso} other {Corsi}}

Introduzione a R

{hours} ore
3.1M
Impara le basi dell'analisi dei dati in R, compresi vettori, liste e data frame, e fai pratica con R con set di dati reali.
Vedi i dettagliRight Arrow
Inizia Il Corso
Mostra altroRight Arrow
Correlato

{count, plural, one {blog} other {blogs}}

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

{count, plural, one {blog} other {blogs}}

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

{count, plural, one {blog} other {blogs}}

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

Mostra AltroMostra Altro