HW 03 - Importazione dei dati, join e manipolazione con dplyr

Data di consegna: martedì 13 ottobre 2026

Introduzione

In questo compito lavorerai sui dati (fittizi) di un corso di laurea magistrale: l’anagrafica degli iscritti, i verbali degli esami sostenuti, l’elenco degli insegnamenti e gli elenchi degli iscritti a due laboratori facoltativi, uno di R e uno di Python.

In questo compito utilizzerai i comandi utili per:

  • importare in R file di testo delimitati e file in formato MS-Excel
  • pulire i nomi delle colonne di una tabella
  • combinare due tabelle con i mutating joins e i filtering joins
  • confrontare due tabelle con le operazioni su insiemi
  • creare factor e ordered factor
  • creare e trasformare le variabili di una tabella con i verbi di dplyr
  • usare un assistente AI per generare codice R e verificarne la correttezza

Obiettivi di apprendimento

Lo svolgimento di questo compito ti permetterà di:

  • scegliere la funzione e gli argomenti di importazione adatti al formato di un file
  • riconoscere i problemi più comuni in fase di importazione dei dati
  • scegliere il tipo di join adatto a rispondere a una domanda concreta
  • comprendere come i join gestiscono le righe senza corrispondenza e le relazioni “uno a molti”
  • comprendere cosa confrontano le operazioni su insiemi
  • costruire nuove variabili, ricodificare e classificare variabili esistenti

Istruzioni per l’uso

  • Crea un progetto RStudio di nome hw03 (in Positron: crea una cartella hw03 e aprila con File → Open Folder) e lavora all’interno del progetto per tutto il compito.

  • All’interno della cartella del progetto crea una sottocartella dati-hw03 e salva al suo interno i quattro file dei dati che trovi su Teams, allegati al compito:

    • anagrafica_studenti.csv
    • esami.xlsx
    • iscritti_lab_r.txt
    • iscritti_lab_python.txt
  • Nello script indica i file sempre con un percorso relativo alla cartella del progetto, ad esempio "dati-hw03/esami.xlsx": non usare percorsi assoluti come "C:/Users/...".

  • Rispondi ai vari punti salvando le risposte in un file R con il nome “hw03_cognome_nome.R”: ad esempio nel mio caso il nome del file sarebbe “hw03_vistocco_domenico.R”. Salva lo script nella cartella del progetto.

  • Inizia lo script con un commento che riporti titolo del compito, nome, cognome e data.

  • Per rispondere ad ogni punto inserisci un’etichetta di sezione (che puoi inserire nello script usando la combinazione di tasti CTRL/CMD + SHIFT + R) utilizzando il punto cui stai rispondendo. Ad esempio, per rispondere al punto 1 del compito, usa un’etichetta di sezione:

    # PUNTO 1 ------------------------------------------------
  • Utilizza i commenti per rispondere alle domande in cui viene chiesta un’interpretazione da parte tua: nei commenti concentrati sul comportamento di R (cosa è successo e perché), con parole tue.

  • Lo script deve essere funzionante quando si eseguono tutti i comandi con il pulsante Source. I comandi che restituiscono un errore vanno quindi lasciati nello script ma commentati (preceduti da #), riportando subito sotto, sempre come commento, il messaggio di errore ottenuto.

  • Rispetta le regole di stile viste in aula: nomi degli oggetti in snake case, <- per l’assegnazione, spazi attorno agli operatori e dopo le virgole, una istruzione per riga. Quando concateni più operazioni con la pipe, vai a capo dopo ogni pipe.

  • Lo script viene valutato sia in base alla correttezza del codice che in base alla qualità (stile utilizzato per rendere lo script leggibile ed ordinato).

Esercizi

NoteNota

Ricordati di utilizzare i commenti per le risposte aperte e di commentare i comandi che restituiscono un errore. Molte domande chiedono “quanti” o “quali”: rispondi sempre con il codice che produce il risultato e riporta la risposta anche in un commento.

Parte 1: Importazione dei dati

  1. Carica i package tidyverse, readxl e janitor. Stampa poi a video la versione del package dplyr installata sul tuo computer
TipSuggerimento
  • Il package janitor non fa parte del tidyverse: se non è installato, installalo una sola volta con install.packages("janitor") e non lasciare l’istruzione di installazione nello script (o lasciala commentata).
  • Il package readxl viene installato insieme al tidyverse, ma non viene caricato da library(tidyverse): va caricato esplicitamente.
  • La versione di un package si ottiene con la funzione packageVersion, ad esempio packageVersion("dplyr"). Le funzioni recode_values e replace_values usate nella Parte 6 richiedono dplyr in versione 1.2.0 o successiva: se la tua versione è precedente, aggiorna il package con install.packages("dplyr") e riavvia R.
  1. Apri il file anagrafica_studenti.csv come file di testo (in RStudio: pannello Files, clic sul nome del file e poi View File; in Positron basta un clic sul file nel pannello Explorer). Descrivi in un commento: quale carattere separa le colonne? Quale carattere separa la parte intera dalla parte decimale dei numeri? Cosa contiene la prima riga? Come sono indicati i valori mancanti?

  2. Importa il file anagrafica_studenti.csv in un oggetto anag_rt con l’istruzione read.table("dati-hw03/anagrafica_studenti.csv", sep = ";", header = TRUE, dec = ","). Stampa a video le dimensioni di anag_rt e la colonna Matricola, e confronta il risultato con il contenuto del file. Quanti studenti mancano? Quali?

Warning

Questo comando restituisce un messaggio di avvertimento, ma soprattutto produce un risultato sbagliato senza segnalare alcun errore

TipSuggerimento

Osserva con attenzione i cognomi dei primi studenti nel file e consulta, nella pagina di help di read.table, la descrizione dell’argomento quote e il suo valore di default. Dopo aver individuato il problema, ripeti l’importazione modificando opportunamente l’argomento quote e verifica che le righe importate siano 30.

  1. Importa lo stesso file in un oggetto anag_base usando la funzione read.csv2. Stampa a video le dimensioni, la classe e i nomi delle colonne di anag_base. Confronta i nomi delle colonne con quelli presenti nella prima riga del file: cosa è accaduto agli spazi, alle parentesi e al simbolo €?
TipSuggerimento

read.csv2 è una variante di read.table con argomenti di default pensati per i file CSV “all’italiana” (sep = ";" e dec = ","). La trasformazione dei nomi delle colonne dipende dall’argomento check.names (consulta la pagina di help): R trasforma i nomi in nomi validi secondo le regole di nomenclatura viste nella prima settimana.

  1. Importa lo stesso file in un oggetto anag_tmp usando la funzione read_delim del package readr, specificando solo il separatore delle colonne. Leggi il messaggio stampato da R (Column specification) e stampa a video la classe della colonna dell’ISEE. Commenta: perché R non ha riconosciuto l’ISEE come numero?
TipSuggerimento

I nomi delle colonne che contengono spazi o simboli non sono nomi validi: per usarli con l’operatore $ vanno racchiusi tra apici inversi, ad esempio anag_tmp$`ISEE (€)`.

  1. Importa nuovamente il file in un oggetto anagrafica con la funzione read_delim, indicando questa volta anche il separatore decimale corretto. Verifica che la colonna dell’ISEE sia ora numerica. Confronta la classe e i nomi delle colonne di anagrafica con quelli di anag_base (punto 4) e commenta le differenze
TipSuggerimento

In read_delim il separatore decimale si specifica attraverso l’argomento locale, che a sua volta richiede la funzione locale: ad esempio locale = locale(decimal_mark = ","). In alternativa puoi usare la funzione read_csv2, che per default usa ; come separatore delle colonne e , come separatore decimale.

  1. Pulisci i nomi delle colonne di anagrafica con la funzione clean_names del package janitor, sovrascrivendo l’oggetto. Stampa a video i nomi delle colonne prima e dopo la pulizia e descrivi le regole applicate dalla funzione. Al termine, cancella dal workspace gli oggetti anag_rt, anag_base e anag_tmp, che non serviranno più
TipSuggerimento

La funzione clean_names trasforma i nomi delle colonne di una tabella in nomi validi e uniformi: lettere minuscole, parole separate dal trattino basso (snake case), senza spazi, accenti o simboli. Per applicarla puoi sfruttare la pipe: anagrafica <- anagrafica |> clean_names().

  1. Stampa a video i nomi dei fogli contenuti nel file esami.xlsx. Se sul tuo computer è installato un foglio elettronico (Excel, LibreOffice Calc, Numbers), apri il file e descrivi brevemente il contenuto del foglio Esami
TipSuggerimento

Puoi sfruttare la funzione excel_sheets del package readxl.

  1. Importa il foglio Esami con la funzione read_excel, specificando soltanto il nome del file e il nome del foglio, e stampa a video il risultato. Commenta: quali problemi presentano i nomi e il tipo delle colonne? Cosa rappresentano i numeri come 46042 nella terza colonna?
TipSuggerimento

Excel memorizza le date come numero di giorni trascorsi da una data di riferimento (il 30 dicembre 1899): il numero viene mostrato come data solo grazie alla formattazione della cella.

  1. Importa correttamente il foglio Esami in un oggetto esami, saltando le righe che precedono l’intestazione, e pulisci i nomi delle colonne. Stampa a video esami e commenta il tipo di dato assegnato alla colonna della data
TipSuggerimento

Consulta la pagina di help di read_excel per individuare l’argomento che permette di saltare un certo numero di righe all’inizio del foglio.

  1. Importa il foglio Insegnamenti in un oggetto insegnamenti e pulisci i nomi delle colonne. Stampa a video il risultato

  2. Importa i file iscritti_lab_r.txt e iscritti_lab_python.txt in due oggetti lab_r e lab_python, pulendo i nomi delle colonne. Stampa poi a video, per ciascuna delle cinque tabelle importate (anagrafica, esami, insegnamenti, lab_r e lab_python), il numero di righe e di colonne

TipSuggerimento

I due file sono delimitati dal carattere di tabulazione (che in R si indica con "\t"). Puoi usare read_delim con delim = "\t" oppure la sua variante read_tsv. Per avere una visione d’insieme di una tabella (dimensioni, nomi e tipi delle colonne, primi valori) puoi usare anche la funzione glimpse del package dplyr.

Parte 2: Mutating joins

Le tabelle anagrafica ed esami contengono informazioni sugli stessi studenti: ogni studente compare una sola volta in anagrafica, ma può comparire più volte in esami, una per ogni esame sostenuto.

  1. Esegui l’istruzione inner_join(esami, anagrafica), senza specificare l’argomento by, e commenta l’errore. Quali sono le colonne che permettono di collegare le due tabelle?
Warning

Questo comando restituisce un errore

  1. Quanti esami sono stati verbalizzati per studenti presenti in anagrafica? Rispondi creando un oggetto esami_iscritti con un inner_join tra esami e anagrafica, e confronta il numero di righe di esami_iscritti con quello di esami. Quale dei due nomi della colonna chiave compare nel risultato?
TipSuggerimento

Quando le colonne chiave hanno nomi diversi nelle due tabelle, si usa la funzione join_by indicando a sinistra di == la colonna della prima tabella e a destra quella della seconda: by = join_by(matr == matricola).

  1. La segreteria vuole l’elenco di tutti gli esami verbalizzati, completato con i dati anagrafici degli studenti quando sono disponibili, senza perdere nessun esame. Scegli il tipo di join adatto e salva il risultato in un oggetto esami_tutti. Quante righe contiene? In quante righe manca il cognome dello studente? Commenta

  2. Il coordinatore del corso vuole, per ogni iscritto, l’elenco degli esami sostenuti, includendo anche gli iscritti che non hanno ancora sostenuto esami. Scegli il tipo di join adatto, mettendo anagrafica come prima tabella, e salva il risultato in un oggetto carriere. Perché il numero di righe di carriere è maggiore del numero di iscritti? In quante righe manca il voto, e perché?

  3. Ottieni lo stesso risultato del punto 16 con un right_join, mettendo esami come prima tabella, e salva il risultato in carriere_r. Confronta il numero di righe, i nomi e l’ordine delle colonne di carriere e carriere_r. Prova poi a confrontare le due tabelle con l’istruzione setequal(carriere, carriere_r) e commenta l’errore. Infine rinomina in carriere_r la colonna chiave in modo che abbia lo stesso nome che ha in carriere e ripeti il confronto

Warning

Il confronto con setequal, prima di rinominare la colonna, restituisce un errore

TipSuggerimento

La funzione setequal di dplyr verifica se due tabelle contengono le stesse righe, indipendentemente dal loro ordine e dall’ordine delle colonne. Per rinominare una colonna puoi usare la funzione rename (sintassi: rename(tabella, nuovo_nome = vecchio_nome)).

  1. Calcola il numero di righe del full_join tra anagrafica ed esami. Spiega da quali “gruppi” di righe è composto il risultato, verificando che il numero di righe del full_join si ottiene sommando opportunamente i risultati ottenuti ai punti 14, 15 e 16

  2. Unisci a ciascun esame le informazioni sull’insegnamento, con un inner_join tra esami e insegnamenti. Scrivi il join in due modi: indicando le colonne chiave con join_by e indicandole con un vettore con nomi (by = c("nome_in_esami" = "nome_in_insegnamenti")). Verifica con la funzione identical che i due risultati coincidano

Parte 3: Filtering joins

  1. Quanti iscritti hanno sostenuto almeno un esame? Rispondi con un semi_join tra anagrafica ed esami. Confronta il numero di righe e le colonne del risultato con quelle di esami_iscritti (punto 14) e spiega la differenza tra semi_join e inner_join

  2. Quali iscritti non hanno ancora sostenuto alcun esame? Rispondi con un anti_join e osserva le colonne anno_immatricolazione e tipo_iscrizione degli studenti individuati: come si spiega il risultato?

  3. Quali esami risultano verbalizzati per studenti che non compaiono in anagrafica? Rispondi con un anti_join. Osservando le matricole, prova a formulare un’ipotesi su chi siano questi studenti

  4. Quali insegnamenti non hanno ancora alcun esame verbalizzato? Rispondi con un anti_join e spiega il risultato osservando le colonne anno_di_corso e semestre, sapendo che i dati sono aggiornati a ottobre 2026 e che gli studenti più “anziani” si sono immatricolati nel 2025

Parte 4: I laboratori di R e di Python e le operazioni su insiemi

Le tabelle lab_r e lab_python contengono gli iscritti ai due laboratori facoltativi, con le stesse tre colonne: matricola, cognome e nome.

  1. Esegui un inner_join tra lab_r e lab_python senza specificare l’argomento by. Leggi il messaggio stampato da R: quali colonne sono state usate come chiave? Quante righe contiene il risultato?

  2. Ripeti il join del punto 24 usando come chiave la sola colonna matricola. Quante righe contiene ora il risultato? Osserva i nomi delle colonne: cosa indicano i suffissi .x e .y? Ripeti il join scegliendo suffissi più leggibili e, confrontando le colonne del risultato, individua lo studente responsabile della differenza tra i risultati dei punti 24 e 25

TipSuggerimento

I suffissi aggiunti alle colonne con lo stesso nome presenti in entrambe le tabelle si scelgono con l’argomento suffix, ad esempio suffix = c("_r", "_python").

  1. Quali studenti sono iscritti a entrambi i laboratori? Rispondi con la funzione intersect e confronta il risultato con quello del punto 24
TipSuggerimento

Caricando dplyr, le funzioni intersect, union, setdiff e setequal del package base vengono “mascherate” dalle omonime funzioni di dplyr (lo hai visto nel messaggio stampato al caricamento del package). Le versioni di dplyr confrontano le righe di due tabelle con le stesse colonne; quelle di base lavorano sugli elementi di due vettori e restano accessibili con l’operatore ::, ad esempio base::intersect(lab_r$matricola, lab_python$matricola).

  1. Quanti studenti sono iscritti ad almeno uno dei due laboratori? Rispondi con la funzione union. Il risultato è corretto? Spiega perché, alla luce di quanto osservato al punto 25

  2. Unisci le due tabelle con la funzione union_all. Quante righe contiene il risultato? Spiega la differenza rispetto a union

  3. Quali studenti sono iscritti solo al laboratorio di R? E quali solo a quello di Python? Rispondi con la funzione setdiff e commenta: l’ordine delle due tabelle nella chiamata è rilevante?

  4. Quali studenti sono iscritti a uno solo dei due laboratori? Rispondi con la funzione symdiff e verifica che il numero di righe del risultato coincida con la differenza tra il numero di righe dei risultati dei punti 27 e 26

  5. Esegui le istruzioni setequal(lab_r, arrange(lab_r, cognome)) e identical(lab_r, arrange(lab_r, cognome)) e commenta la differenza tra i due risultati

TipSuggerimento

La funzione arrange di dplyr ordina le righe di una tabella secondo i valori delle colonne indicate.

  1. Correggi in lab_python il nome dello studente individuato al punto 25, usando le funzioni mutate e replace_values. Ripeti poi le operazioni dei punti 26 e 27 e verifica con setequal che il risultato di intersect coincida ora con quello di semi_join(lab_r, lab_python, by = "matricola")
TipSuggerimento

La funzione replace_values sostituisce i valori indicati e lascia invariati tutti gli altri. Le sostituzioni si scrivono nella forma vecchio_valore ~ nuovo_valore, ad esempio replace_values(x, "a" ~ "b").

Parte 5: La tabella per l’analisi e i factor

  1. Il corso di studio vuole analizzare le carriere dei propri iscritti. Costruisci una tabella esami_completo che contenga, per ogni esame sostenuto da uno studente presente in anagrafica, le informazioni anagrafiche dello studente e le informazioni sull’insegnamento. Usa un’unica sequenza di istruzioni collegate dalla pipe, partendo da esami, e motiva in un commento la scelta dei tipi di join utilizzati. Stampa a video le dimensioni della tabella ottenuta

  2. Converti in factor la colonna genere di anagrafica usando l’operatore $. Stampa a video la classe della colonna prima e dopo la conversione, i livelli (funzione levels), il numero di livelli (funzione nlevels) e il risultato della funzione summary applicata alla colonna. Stampa poi la classe della colonna genere di esami_completo e commenta: perché la conversione non ha avuto effetto anche su esami_completo?

  3. Stampa a video i livelli di factor(anagrafica$regione_di_residenza) e commenta l’ordine in cui compaiono. Esegui poi l’istruzione factor(anagrafica$regione_di_residenza, levels = c("Campania", "Lazio", "Puglia")): cosa accade ai valori delle altre regioni? Quanti sono?

  4. Converti in factor la colonna genere di esami_completo, questa volta usando la funzione mutate, in modo che i livelli siano etichettati come Femmina e Maschio. Verifica il risultato con la funzione summary

TipSuggerimento

La funzione factor ha due argomenti distinti: levels indica i valori presenti nei dati (e il loro ordine), mentre labels indica le etichette con cui quei valori verranno mostrati.

Parte 6: Manipolazione dei dati con dplyr

Tutti i punti di questa parte si riferiscono alla tabella esami_completo: salva ogni volta il risultato sovrascrivendo la tabella.

  1. Rinomina le colonne voto_laurea_su_110 e anno_di_nascita rispettivamente in voto_triennale e anno_nascita

  2. Aggiungi alla tabella due nuove colonne: eta, che contenga l’età (in anni compiuti nel 2026) dello studente, e voto_pesato, che contenga il prodotto tra il voto dell’esame e i CFU dell’insegnamento. Commenta: a cosa può servire la colonna voto_pesato?

  3. Aggiungi una colonna log_isee con il logaritmo naturale dell’ISEE. Applica la funzione summary alla nuova colonna e commenta i valori minimo e medio e il numero di NA: a quali studenti corrispondono i valori problematici? Ripeti l’operazione con la radice quadrata (colonna sqrt_isee) e confronta il comportamento delle due trasformazioni sui valori problematici

TipSuggerimento

Ricorda quanto visto nel compito precedente su Inf, -Inf e NA. Per individuare gli studenti puoi sfruttare le funzioni is.infinite e is.na per il puntamento sulla colonna cognome.

  1. Secondo il regolamento (ipotetico) del corso, ai fini del calcolo della media un 30 e lode vale 31. Aggiungi una colonna voto_media che valga 31 per gli esami superati con lode e coincida con il voto negli altri casi, usando la funzione if_else. Quanti esami hanno voto_media pari a 31?

  2. Prova ad aggiungere una colonna con l’istruzione if_else(lode == "SI", "30 e lode", voto) all’interno di mutate e commenta l’errore. Esegui poi l’istruzione ifelse(esami_completo$lode == "SI", "30 e lode", esami_completo$voto) (funzione ifelse del package base) e osserva la modalità del risultato: quale delle due funzioni ritieni più “sicura”, e perché?

Warning

Il primo comando restituisce un errore

  1. Aggiungi una colonna giudizio che classifichi ogni esame secondo il seguente schema, usando la funzione case_when:

    • "sufficiente": voto da 18 a 21
    • "discreto": voto da 22 a 25
    • "buono": voto da 26 a 28
    • "ottimo": voto 29 o 30 senza lode
    • "eccellente": 30 e lode

    Verifica il risultato con summary(factor(esami_completo$giudizio))

  2. Riscrivi la case_when del punto 42 mettendo la condizione relativa all’"ottimo" (voto maggiore o uguale a 29) prima di quella relativa all’"eccellente", salvando il risultato in un vettore a parte (senza modificare la tabella). Confronta i due risultati e spiega come case_when valuta le condizioni

  3. Converti la colonna giudizio in un ordered factor, con i livelli ordinati dal giudizio più basso al più alto. Esegui poi le seguenti operazioni e commenta i risultati:

    • ordina la tabella con arrange(esami_completo, giudizio) e con arrange(esami_completo, as.character(giudizio)) e confronta l’ordine delle prime righe
    • calcola il numero e la proporzione di esami con giudizio almeno "buono"
TipSuggerimento

Un ordered factor si crea con la funzione factor e l’argomento ordered = TRUE (oppure con la funzione ordered). Con un ordered factor gli operatori relazionali (<, >=, …) confrontano le posizioni dei livelli.

  1. Usando la funzione recode_values:

    • ricodifica la colonna tipo_iscrizione, sostituendo TP con Tempo pieno e PT con Part-time
    • aggiungi una colonna ripartizione con la ripartizione geografica ISTAT della regione di residenza: Nord-ovest (Piemonte, Valle d’Aosta, Liguria, Lombardia), Nord-est (Trentino-Alto Adige, Veneto, Friuli-Venezia Giulia, Emilia-Romagna), Centro (Toscana, Umbria, Marche, Lazio), Sud (Abruzzo, Molise, Campania, Puglia, Basilicata, Calabria), Isole (Sicilia, Sardegna)

    Converti infine ripartizione in un factor con i livelli nell’ordine geografico indicato sopra e applica la funzione summary. Commenta la presenza di un livello con frequenza nulla

TipSuggerimento

Con recode_values più valori possono essere ricodificati nello stesso valore indicando un vettore a sinistra della tilde, ad esempio c("Toscana", "Umbria", "Marche", "Lazio") ~ "Centro". A differenza di replace_values, i valori non indicati vengono trasformati in NA (a meno di specificare l’argomento default).

  1. Stampa a video i valori distinti della colonna laurea_triennale e individua il problema di codifica presente. Correggilo con la funzione replace_values e verifica che il numero di valori distinti sia diminuito
TipSuggerimento

La funzione unique restituisce i valori distinti di un vettore, la funzione n_distinct di dplyr il loro numero.

  1. Per l’anno accademico in corso, il contributo universitario dipende dall’ISEE: esonero totale (no tax area) fino a 22.000 € inclusi, contributo ridotto oltre 22.000 € e fino a 30.000 € inclusi, contributo pieno oltre 30.000 €. Aggiungi una colonna fascia_isee usando la funzione cut con i punti di separazione c(0, 22000, 30000, Inf) e le etichette "No tax area", "Contributo ridotto" e "Contributo pieno". Verifica poi:

    • a quale fascia sono stati assegnati gli studenti Caruso e Ferri (ISEE pari esattamente a 22.000 € e a 29.999,99 €)
    • se esistono righe con fascia_isee mancante pur avendo un ISEE disponibile: a quale studente corrispondono, e perché?

    Correggi infine il problema individuato, intervenendo sugli argomenti della funzione cut

TipSuggerimento

Consulta la pagina di help di cut: gli argomenti right e include.lowest stabiliscono se gli estremi degli intervalli siano inclusi o esclusi.

  1. Classifica la colonna voto in classi usando le funzioni cut_interval(voto, n = 4), cut_width(voto, width = 3), cut_width(voto, width = 3, boundary = 18) e cut_number(voto, n = 4). Per ciascuna applica la funzione summary al risultato e commenta: quale criterio usa ciascuna funzione per costruire le classi? Perché le quattro classi di cut_number non contengono lo stesso numero di esami?
TipSuggerimento

Le funzioni cut_interval, cut_width e cut_number appartengono al package ggplot2, che viene caricato con il tidyverse. cut_interval crea n classi della stessa ampiezza, cut_width crea classi di ampiezza width e cut_number crea n classi contenenti (approssimativamente) lo stesso numero di osservazioni.

  1. Crea un oggetto esami_report a partire da esami_completo in cui:

    • le colonne cognome, nome, insegnamento, data_esame, voto e giudizio siano le prime della tabella, in quest’ordine, e la colonna voto_pesato si trovi subito dopo voto
    • le righe siano ordinate per cognome e, a parità di cognome, per data dell’esame

    Ordina poi esami_report per ISEE decrescente e osserva le ultime righe: dove vengono collocati i valori mancanti?

TipSuggerimento

Usa la funzione relocate per spostare le colonne (consulta l’help per l’argomento .after) e la funzione arrange per ordinare le righe; per l’ordine decrescente si usa la funzione desc.

Parte 7: Generazione di codice con un assistente AI

  1. Si vuole aggiungere a esami_completo una colonna sessione che indichi la sessione d’esame: "invernale" per gli esami di gennaio e febbraio, "estiva" per quelli di giugno e luglio, "autunnale" per quelli di settembre. Usa un assistente AI a tua scelta (ad esempio Claude, ChatGPT, Copilot, Gemini) per ottenere il codice, procedendo in due passi:

    1. scrivi un primo prompt breve e generico, che descriva solo il risultato desiderato
    2. scrivi un secondo prompt che fornisca il contesto: nome e struttura della tabella (puoi incollare l’output di glimpse(esami_completo)), package da usare, funzioni viste a lezione

    Riporta nello script, come commento, i due prompt e il nome dell’assistente utilizzato, e inserisci il codice ottenuto. Verifica che il codice funzioni e che il risultato sia corretto (ad esempio controllando, con summary(factor(esami_completo$sessione)), che non ci siano valori mancanti e che i conteggi siano plausibili). Commenta infine: in cosa differiscono le due risposte? L’assistente ha usato funzioni che non abbiamo visto in aula? Se sì, cosa fanno?

Warning

Il codice generato da un assistente AI può contenere errori, anche quando sembra funzionare: sei tu responsabile del codice che inserisci nello script. Non limitarti a copiarlo: eseguilo, controlla il risultato e assicurati di capire cosa fa ogni istruzione.

Consegna

Per inviare la tua soluzione:

  • Carica il file hw03_cognome_nome.R su Teams, in risposta al compito assegnato

Valutazione

Totale punti disponibili: 110 punti

Component Punti
Es 1 - 50 100
Workflow & formattazione 101

Footnotes

  1. La valutazione al “Workflow & formattazione” tiene conto del rispetto delle regole di stile e del principio di riproducibilità del codice: lo script caricato deve funzionare senza errori su qualunque PC, eseguendolo con Source in una sessione con workspace vuoto e con i file dei dati nella sottocartella dati-hw03 del progetto, dando gli stessi risultati↩︎