Programma
Per aumentare le tue probabilità di successo in un colloquio su R, è sempre utile sapere in anticipo quali domande potrebbero farti se stai cercando lavoro—o quali domande puoi fare a un candidato se sei un hiring manager o un recruiter.
Questo articolo illustra 40 domande fondamentali per colloqui su R programming e le relative risposte per tutti i livelli di seniority, oltre ad alcune domande generali. Per comodità, tutte le domande tecniche sono suddivise in tre livelli: base, intermedio e avanzato.
Come risorse aggiuntive per prepararti a un colloquio su R, considera i seguenti blog e corsi utili:
- Esercitarsi con domande di statistica per colloqui in R
- Preparazione al colloquio per Data Science
- 21 principali domande per colloqui da Data Scientist
Domande generali per colloqui su R Programming
All'inizio di un colloquio su R, l'intervistatore può fare al candidato alcune domande generali e non tecniche sulla sua esperienza complessiva con R. Per esempio:
- Da quanto tempo lavori con R?
- Che tipo di attività svolgi in R?
- Come valuti il tuo livello di competenza in R?
Se stai cercando lavoro, dovresti pensare in anticipo a queste e a domande simili e preparare le tue risposte. Non preoccuparti se non hai ancora esperienza lavorativa reale in R: descrivere il tuo stage in R programming o i tuoi progetti in R individuali o di gruppo svolti durante gli studi va benissimo.
Inoltre, se stai sostenendo un colloquio per una posizione entry-level, l'intervistatore non si aspetta necessariamente da te un'esperienza lavorativa estesa (o anche alcuna) in R. Ricorda che, se sei stato invitato a questo colloquio, l'azienda ha comunque trovato il tuo CV interessante.
Domande di R Programming a livello base
Cominciamo con alcune domande tecniche basilari su R che potresti affrontare con un potenziale datore di lavoro. Richiedono di aver padroneggiato le basi e di avere un po' di esperienza pratica con R.
1. Che cos'è R e quali sono le sue principali caratteristiche?
R è un linguaggio di programmazione e un ambiente ampiamente utilizzato per risolvere problemi di data science e progettato in particolare per il calcolo statistico e la visualizzazione dei dati. Le sue principali caratteristiche includono:
- Open source
- Interpretato (ossia supporta sia la programmazione funzionale sia quella orientata agli oggetti)
- Altamente estensibile grazie alla sua ampia raccolta di pacchetti per la data science
- Funzionale e flessibile (gli utenti possono definire funzioni proprie e regolare vari parametri delle funzioni esistenti)
- Compatibile con molti sistemi operativi
- Facilmente integrabile con altri linguaggi e framework
- Consente un potente calcolo statistico
- Offre una varietà di strumenti di visualizzazione per creare grafici di qualità da pubblicazione
- Dotato di interfaccia a riga di comando
- Supportato da una solida community online
2. Quali sono alcuni svantaggi dell'uso di R?
- Sintassi non intuitiva e quindi curva di apprendimento ripida, soprattutto per chi è alle prime armi con la programmazione
- Relativamente lento
- Uso inefficiente della memoria
- Documentazione dei pacchetti incoerente e spesso difficile da leggere
- Alcuni pacchetti sono di bassa qualità o poco mantenuti
- Potenziali problemi di sicurezza dovuti alla sua natura open source
3. Elenca e definisci alcuni tipi di dato di base in R.
Esistono alcuni tipi di dato in R, tra cui:
- Numeric—numeri decimali.
- Integer—numeri interi.
- Character—una lettera, un numero o un simbolo, o qualsiasi loro combinazione, racchiusi tra virgolette doppie o singole.
- Factor—categorie da un insieme predefinito di valori possibili, spesso con un ordine intrinseco.
- Logical—i valori booleani
TRUEeFALSE, rappresentati internamente rispettivamente come 1 e 0.
4. Elenca e definisci alcune strutture dati di base in R.
- Vector—struttura dati monodimensionale usata per memorizzare valori dello stesso tipo.
- List—struttura dati multidimensionale usata per memorizzare valori di qualsiasi tipo e/o altre strutture dati.
- Matrix—struttura dati bidimensionale usata per memorizzare valori dello stesso tipo.
- Data frame—struttura dati bidimensionale usata per memorizzare valori di qualsiasi tipo, ma ogni colonna deve contenere valori dello stesso tipo.
5. Come si importano i dati in R?
Il base R fornisce funzioni essenziali per importare i dati:
-
read.table()—la funzione più generale del base R per importare dati; accetta dati tabellari con qualsiasi tipo di separatore di campo, inclusi separatori specifici come |. -
read.csv()—file comma-separated values (CSV) con.come separatore decimale. -
read.csv2()—file con valori separati da punto e virgola con,come separatore decimale. -
read.delim()—file tab-separated values (TSV) con.come separatore decimale. -
read.delim2()—file tab-separated values (TSV) con,come separatore decimale.
In pratica, ognuna di queste funzioni può essere usata per importare dati tabellari con qualsiasi tipo di separatore di campo e decimale: usarle per i formati di file specificati è solo una questione di convenzione e impostazioni predefinite. Per esempio, ecco la sintassi della prima funzione: read.table(file, header = FALSE, sep = "", dec = "."). Le altre funzioni hanno gli stessi parametri con impostazioni predefinite diverse che possono sempre essere sovrascritte esplicitamente.
I pacchetti tidyverse readr e readxl offrono altre funzioni per importare formati di file specifici. Ciascuna di queste funzioni può essere ulteriormente affinata impostando vari parametri opzionali.
readr
-
read_tsv()—file tab-separated values (TSV). -
read_fwf()—file a larghezza fissa. -
read_log()—file di log web. -
read_table(),read_csv(),read_csv2()eread_delim()—equivalenti alle funzioni del base R.
readxl
-
read_excel()—file Excel. -
read_csv()—equivalente alla funzione del base R.
Per approfondire il caricamento dati in R, puoi seguire il tutorial How to Import Data Into R.
6. Che cos'è un pacchetto in R e come si installano e si caricano i pacchetti?
Un pacchetto R è una raccolta di funzioni, codice, dati e documentazione, che rappresenta un'estensione del linguaggio R ed è progettata per risolvere specifici tipi di compiti. R include vari pacchetti preinstallati, e gli utenti possono installarne altri dai repository. Il repository centralizzato più popolare, che ospita migliaia di pacchetti R, si chiama Comprehensive R Archive Network (CRAN).
Per installare un pacchetto R direttamente da CRAN, dobbiamo passare il nome del pacchetto racchiuso tra virgolette alla funzione install.packages(), come segue: install.packages("package_name"). Per installare più di un pacchetto da CRAN in un solo passaggio, dobbiamo usare un vettore di caratteri contenente i nomi dei pacchetti tra virgolette, come segue: install.packages(c("package_name_1", "package_name_2"). Per installare manualmente un pacchetto R, dobbiamo prima scaricare il pacchetto come file zip sul computer e poi eseguire la install.packages() function:
install.packages("path_to_the_locally_stored_zipped_package_file", repos=NULL, type="source")
Per caricare un pacchetto R installato nell'ambiente di lavoro, possiamo usare le funzioni library() o require(). Ognuna accetta il nome del pacchetto senza virgolette e lo carica, ad esempio library(caret). Tuttavia, il comportamento di queste funzioni differisce quando non trovano il pacchetto necessario: library() genera un errore e interrompe l'esecuzione del programma, mentre require() genera un avviso e continua l'esecuzione.
7. Come si crea un data frame in R?
1. Da uno o più vettori della stessa lunghezza—usando la funzione data.frame():
df <- data.frame(vector_1, vector_2)
2. Da una matrice—usando la funzione data.frame():
df <- data.frame(my_matrix)
3. Da una lista di vettori della stessa lunghezza—usando la funzione data.frame():
df <- data.frame(list_of_vectors)
4. Da altri data frame:
-
Per combinare i data frame orizzontalmente (solo se i data frame hanno lo stesso numero di righe e i record sono gli stessi e nello stesso ordine) —usando la funzione
cbind():
df <- cbind(df1, df2)
-
Per combinare i data frame verticalmente (solo se hanno lo stesso numero di colonne con nomi identici, dello stesso tipo di dato e nello stesso ordine) —usando la funzione
rbind():
df <- rbind(df1, df2)
8. Come aggiungi una nuova colonna a un data frame in R?
- Usando il simbolo
$:
df <- data.frame(col_1=10:13, col_2=c("a", "b", "c", "d"))
print(df)
df$col_3 <- c(5, 1, 18, 16)
print(df)
Output:
col_1 col_2
1 10 a
2 11 b
3 12 c
4 13 d
col_1 col_2 col_3
1 10 a 5
2 11 b 1
3 12 c 18
4 13 d 16
- Usando le parentesi quadre:
df <- data.frame(col_1=10:13, col_2=c("a", "b", "c", "d"))
print(df)
df["col_3"] <- c(5, 1, 18, 16)
print(df)
Output:
col_1 col_2
1 10 a
2 11 b
3 12 c
4 13 d
col_1 col_2 col_3
1 10 a 5
2 11 b 1
3 12 c 18
4 13 d 16
-
Usando la funzione
cbind():
df <- data.frame(col_1=10:13, col_2=c("a", "b", "c", "d"))
print(df)
df <- cbind(df, col_3=c(5, 1, 18, 16))
print(df)
Output:
col_1 col_2
1 10 a
2 11 b
3 12 c
4 13 d
col_1 col_2 col_3
1 10 a 5
2 11 b 1
3 12 c 18
4 13 d 16
In ognuno dei tre casi, possiamo assegnare un singolo valore o un vettore o calcolare la nuova colonna basandoci sulle colonne esistenti di quel data frame o di altri data frame.
9. Come rimuovere colonne da un data frame in R?
1. Usando la funzione select() del pacchetto dplyr della collezione tidyverse. Il nome di ogni colonna da eliminare è passato con un segno meno davanti:
df <- select(df, -col_1, -col_3)
Se invece abbiamo troppe colonne da eliminare, ha più senso mantenere le restanti colonne piuttosto che cancellare quelle di interesse. In questo caso, la sintassi è simile, ma i nomi delle colonne da mantenere non sono preceduti dal segno meno:
df <- select(df, col_2, col_4)
2. Usando la funzione integrata subset() del base R. Se dobbiamo eliminare una sola colonna, assegniamo al parametro select della funzione il nome della colonna preceduto dal segno meno. Per eliminare più di una colonna, assegniamo a questo parametro un vettore contenente i nomi delle colonne necessarie preceduti dal segno meno:
df <- subset(df, select=-col_1)
df <- subset(df, select=-c(col_1, col_3))
Se invece abbiamo troppe colonne da eliminare, ha più senso mantenere le restanti piuttosto che cancellare quelle di interesse. In questo caso, la sintassi è simile, ma non si aggiunge il segno meno:
df <- subset(df, select=col_2)
df <- subset(df, select=c(col_2, col_4))
10. Che cos'è un factor in R?
Un factor in R è un tipo di dato specifico che accetta categorie (ovvero livelli) da un insieme predefinito di valori possibili. Queste categorie sembrano caratteri, ma internamente sono memorizzate come interi. Spesso tali categorie hanno un ordine intrinseco. Per esempio, una colonna in un data frame che contiene le opzioni della scala di Likert per valutare opinioni ("fortemente d'accordo", "d'accordo", "abbastanza d'accordo", "né d'accordo né in disaccordo", "abbastanza in disaccordo", "in disaccordo", "fortemente in disaccordo") dovrebbe essere di tipo factor per catturare questo ordine intrinseco e rifletterlo correttamente nei grafici categoriali.
11. Che cos'è RStudio?
RStudio è un IDE (ambiente di sviluppo integrato) open source, ampiamente utilizzato come interfaccia grafica per lavorare con il linguaggio R a partire dalla versione 3.0.1. Ha molte funzionalità utili che lo rendono molto popolare tra gli utenti R:
- Facile da usare
- Flessibile
- Multifunzionale
- Consente di creare script riutilizzabili
- Traccia lo storico delle operazioni
- Completa automaticamente il codice
- Offre aiuto dettagliato e completo su qualsiasi oggetto
- Fornisce accesso semplice a tutti i dati importati e agli oggetti creati
- Rende facile passare tra terminale e console
- Consente l'anteprima dei grafici
- Supporta la creazione e la condivisione efficiente di progetti
- Può essere usato con altri linguaggi (Python, SQL, ecc.)
Per saperne di più su cos'è RStudio, come installarlo e iniziare a usarlo, puoi seguire il tutorial su RStudio.
12. Che cos'è R Markdown?
R Markdown è un pacchetto R gratuito e open source che fornisce un framework di authoring per costruire progetti di data science. Con esso possiamo scrivere un unico file .rmd che combina testo, codice e grafici, quindi renderizzare questo file in un formato di output selezionato. Le principali caratteristiche di R Markdown sono:
- I documenti risultanti sono condivisibili, completamente riproducibili e di qualità da pubblicazione.
- Ampia gamma di output e formati statici e dinamici, come HTML, PDF, Microsoft Word, documenti interattivi, dashboard, report, articoli, libri, presentazioni, applicazioni, siti web, template riutilizzabili, ecc.
- Tracciamento semplice del versionamento.
- Supporta più linguaggi di programmazione, tra cui R, Python e SQL.
13. Come si crea una funzione definita dall'utente in R?
Per creare una funzione definita dall'utente in R, usiamo la parola chiave function e la seguente sintassi:
function_name <- function(parameters){
function body
}
- Nome della funzione—il nome dell'oggetto funzione che sarà usato per chiamare la funzione dopo la sua definizione.
- Parametri della funzione—le variabili, separate da virgole e poste tra parentesi tonde, che verranno impostate ai valori effettivi degli argomenti ogni volta che chiamiamo la funzione.
- Corpo della funzione—un blocco di codice tra parentesi graffe contenente le operazioni da eseguire in un ordine predefinito sugli argomenti di input ogni volta che chiamiamo la funzione. Di solito, il corpo della funzione contiene l'istruzione
return()(o più istruzioni) che restituisce l'output della funzione, oppure l'istruzioneprint()(o più istruzioni) per stampare l'output.
Esempio di una semplice funzione definita dall'utente in R:
my_function <- function(x, y){
return(x + y)
}
14. Elenca alcuni pacchetti popolari per la visualizzazione dati in R.
- ggplot2—il pacchetto R per la visualizzazione più popolare, che consente di creare un'ampia varietà di grafici.
- Lattice—per visualizzare dati multivariati come pannelli a griglia (trellis) di più grafici.
- Plotly—per creare grafici interattivi di qualità da pubblicazione.
- highcharter—per plotting dinamico semplice, offre molte funzionalità flessibili, plugin e temi; consente di rappresentare diversi oggetti R con una sola funzione.
- Leaflet—per creare mappe interattive.
- ggvis—per creare grafici interattivi e altamente personalizzabili accessibili da qualsiasi browser usando l'infrastruttura di Shiny.
- patchwork—per combinare più grafici, spesso di vari tipi, nello stesso riquadro.
Domande di R Programming a livello intermedio
Per professionisti più esperti, è probabile che l'intervistatore ponga domande che richiedono una conoscenza più approfondita di R. Eccone alcune su cui prepararti:
15. Come si assegna un valore a una variabile in R?
-
Usando l'operatore di assegnazione
<-, ad es.my_var <- 1—il modo più comune per assegnare un valore a una variabile in R. -
Usando l'operatore uguale
=, ad es.my_var = 1—per assegnare valori agli argomenti all'interno di una definizione di funzione. -
Usando l'operatore di assegnazione verso destra
->, ad es.my_var -> 1—può essere usato nelle pipe. -
Usando gli operatori di assegnazione globale, sia verso sinistra (
<<-) sia verso destra (->>), ad es.my_var <<- 1—per creare una variabile globale all'interno della definizione di una funzione.
16. Quali sono i requisiti per i nomi delle variabili in R?
-
Un nome di variabile può essere una combinazione di lettere, cifre, punti e underscore. Non può contenere altri simboli, inclusi spazi.
-
Un nome di variabile deve iniziare con una lettera o un punto.
-
Se un nome di variabile inizia con un punto, questo punto non può essere seguito da una cifra.
-
Le parole riservate in R (
TRUE,for,NULL, ecc.) non possono essere usate come nomi di variabili. -
I nomi delle variabili fanno distinzione tra maiuscole e minuscole.
Nel corso Writing Efficient R Code troverai ulteriori best practice per scrivere codice in R.
17. Quali tipi di cicli esistono in R e qual è la sintassi di ciascun tipo?
1. For loop—itera su una sequenza per un numero di volte pari alla sua lunghezza (a meno che non si usino le istruzioni break e/o next) ed esegue lo stesso insieme di operazioni su ciascun elemento della sequenza. È il tipo di ciclo più comune. La sintassi di un for loop in R è la seguente:
for (variable in sequence) {
operations
}
2. While loop—esegue lo stesso insieme di operazioni finché non è soddisfatta una condizione logica predefinita (o più condizioni)—a meno che non si usino le istruzioni break e/o next. A differenza dei for loop, non conosciamo in anticipo il numero di iterazioni che un while loop eseguirà. Prima di eseguire un while loop, dobbiamo assegnare una variabile (o più variabili) e poi aggiornarne il valore all'interno del corpo del ciclo a ogni iterazione. La sintassi di un while loop in R è la seguente:
variable assignment
while (logical condition) {
operations
variable update
}
3. Repeat loop—esegue ripetutamente lo stesso insieme di operazioni finché non è soddisfatta una condizione di interruzione predefinita (o più condizioni). Per introdurre tale condizione, un repeat loop deve contenere un blocco if, che a sua volta deve includere l'istruzione break nel suo corpo. Come i while loop, non conosciamo in anticipo il numero di iterazioni che un repeat loop eseguirà. La sintassi di un repeat loop in R è la seguente:
repeat {
operations
if(break condition) {
break
}
}
Puoi leggere di più sui cicli in R nel nostro tutorial dedicato.
18. Come si aggregano i dati in R?
Per aggregare i dati in R, usiamo la funzione aggregate(). Questa funzione ha i seguenti parametri essenziali, in quest'ordine:
-
x—il data frame da aggregare. -
by—una lista di factor per raggruppare. -
FUN—una funzione di aggregazione per calcolare le statistiche di sintesi per ciascun gruppo (ad es.mean,max,min,count,sum).
19. Come si uniscono i dati in R?
1. Usando la funzione cbind()—solo se i data frame hanno lo stesso numero di righe e i record sono gli stessi e nello stesso ordine:
df <- cbind(df1, df2)
2. Usando la funzione rbind() per combinare i data frame verticalmente—solo se hanno lo stesso numero di colonne con nomi identici, dello stesso tipo di dato e nello stesso ordine:
df <- rbind(df1, df2)
3. Usando la funzione merge() per unire data frame tramite una colonna in comune, di solito una colonna ID:
- Inner join:
df <- merge(df1, df2, by="ID")
- Left join:
df <- merge(df1, df2, by="ID", all.x=TRUE)
- Right join:
df <- merge(df1, df2, by="ID", all.y=TRUE)
- Outer join:
df <- merge(df1, df2, by="ID", all=TRUE)
4. Usando la funzione join() del pacchetto dplyr per unire data frame tramite una colonna in comune, di solito una colonna ID:
df <- join(df1, df2, by="ID", type="type_of_join")
Il parametro type accetta uno dei seguenti valori: inner, left, right o full.
20. Come si concatenano le stringhe in R?
Possiamo concatenare due o più stringhe in R usando le funzioni paste() o cat(). Il primo approccio è più comune. Entrambe le funzioni accettano un numero qualsiasi di stringhe da concatenare e possono accettare anche un parametro opzionale sep (insieme ad altri parametri opzionali)—un carattere o una sequenza di caratteri che separerà le stringhe unite nella stringa risultante (uno spazio per impostazione predefinita).
21. Come si trasponogono dati bidimensionali in R?
Possiamo trasporre un data frame o una matrice in R in modo che le colonne diventino righe e viceversa. A tal fine, dobbiamo usare la funzione t() del base R. Per esempio:
df <- data.frame(col_1=c(10, 20, 30), col_2=c(11, 22, 33))
print(df)
transposed_df <- t(df)
print(transposed_df)
Output:
col_1 col_2
1 10 11
2 20 22
3 30 33
[,1] [,2] [,3]
col_1 10 20 30
col_2 11 22 33
22. Come si concatenano più operazioni in R?
Possiamo concatenare più operazioni in R usando l'operatore pipe (%>%) fornito dalla collezione tidyverse. Usare questo operatore consente di creare una pipeline di funzioni in cui l'output della prima funzione viene passato come input alla seconda e così via, fino alla fine della pipeline. Ciò elimina la necessità di creare variabili aggiuntive e migliora notevolmente la leggibilità del codice.
Esempio di uso dell'operatore pipe su un data frame:
df <- data.frame(a=1:4, b=11:14, c=21:24)
print(df)
df_new <- df %>% select(a, b) %>% filter(a > 2)
print(df_new)
Output:
a b c
1 1 11 21
2 2 12 22
3 3 13 23
4 4 14 24
a b
1 3 12
2 4 13
23. Quali tipi di grafici si possono creare in R?
Dato che la visualizzazione dei dati è uno dei punti di forza del linguaggio R, possiamo creare tutti i tipi di grafici in R:
- Tipi di grafici comuni:
- Bar plot—mostra i valori numerici di dati categoriali.
- Line plot—mostra l'andamento di una variabile, di solito nel tempo.
- Scatter plot—mostra le relazioni tra due variabili.
- Area plot—basato su un line plot, con l'area sotto la linea colorata o riempita con un pattern.
- Pie chart—mostra la proporzione di ciascuna categoria di dati categoriali come parte del totale.
- Box plot—mostra un insieme di statistiche descrittive dei dati.
- Tipi di grafici avanzati:
- Violin plot—mostra sia un insieme di statistiche descrittive sia la forma della distribuzione dei dati.
- Heatmap—mostra l'entità di ciascun punto dati numerico all'interno del dataset.
- Treemap—mostra i valori numerici di dati categoriali, spesso come parte del totale.
- Dendrogram—mostra la gerarchia interna e il clustering dei dati.
- Bubble plot—mostra le relazioni tra tre variabili.
- Hexbin plot—mostra le relazioni tra due variabili numeriche in un dataset relativamente grande.
- Word cloud—mostra la frequenza delle parole in un testo di input.
- Choropleth map—mostra statistiche tematiche aggregate di geodati.
- Circular packing chart—mostra una gerarchia interna dei dati e i valori dei punti dati
- ecc.
Lo skill track Data Visualization with R ti aiuterà ad ampliare i tuoi orizzonti nel campo della grafica in R. Se preferisci imparare la visualizzazione in R in un contesto più ampio, esplora il career track approfondito e adatto ai principianti Data Scientist with R.
24. Che cos'è il riciclo dei vettori (vector recycling) in R?
Se proviamo a eseguire un'operazione su due vettori R di lunghezze diverse, l'interprete R rileva internamente quello più corto, ricicla i suoi elementi nello stesso ordine finché le lunghezze dei due vettori combaciano, e solo allora esegue l'operazione necessaria su questi vettori. Prima di iniziare il riciclo, però, l'interprete R genera un messaggio di avviso sulla mancata corrispondenza iniziale delle lunghezze.
Per esempio, se proviamo a eseguire la seguente somma:
c(1, 2, 3, 4, 5) + c(1, 2, 3)
Il secondo vettore, a causa del riciclo, verrà effettivamente convertito in c(1, 2, 3, 1, 2). Di conseguenza, il risultato finale di questa operazione sarà c(2, 4, 6, 5, 7).
Sebbene talvolta il riciclo dei vettori possa essere utile (ad es., quando ci aspettiamo la ciclicità dei valori nei vettori), più spesso è inappropriato e fuorviante. Dovremmo quindi fare attenzione e verificare le lunghezze dei vettori prima di eseguire operazioni su di essi.
25. A cosa servono le istruzioni next e break in R?
L'istruzione next serve a saltare una particolare iterazione e passare alla successiva se è soddisfatta una certa condizione. L'istruzione break serve a fermare ed uscire dal ciclo in una determinata iterazione se è soddisfatta una certa condizione. Quando usata in uno dei cicli interni di un ciclo annidato, questa istruzione esce solo da quel ciclo interno.
Le istruzioni next e break possono essere usate in qualsiasi tipo di ciclo in R: for, while e repeat. Possono anche essere usate nello stesso ciclo, ad es.:
for(i in 1:10) {
if(i < 5)
next
if(i == 8)
break
print(i)}
Output:
[1] 5
[1] 6
[1] 7
26. Qual è la differenza tra le funzioni str() e summary() in R?
La funzione str() restituisce la struttura di un oggetto R e informazioni generali su di esso, il cui contenuto esatto dipende dalla struttura dati di quell'oggetto. Per esempio, per un vettore restituisce il tipo di dato dei suoi elementi, l'intervallo degli indici e i valori (o i primi valori, se il vettore è troppo lungo). Per un data frame, restituisce la classe (data.frame), il numero di osservazioni e variabili, i nomi delle colonne, il tipo di dato di ciascuna colonna e alcuni primi valori di ciascuna colonna.
La funzione summary() restituisce le statistiche di sintesi per un oggetto R. È usata soprattutto su data frame e matrici, per i quali restituisce minimo, massimo, media e mediana, e il 1° e 3° quartile per ciascuna colonna numerica, mentre per le colonne factor restituisce il conteggio di ciascun livello.
27. Qual è la differenza tra le funzioni subset() e sample() in R?
La funzione subset() in R è usata per estrarre righe e colonne da un data frame o da una matrice, o elementi da un vettore, in base a determinate condizioni, ad es.: subset(my_vector, my_vector > 10).
Invece, la funzione sample() in R può essere applicata solo ai vettori. Estrae un campione casuale di dimensione predefinita dagli elementi di un vettore, con o senza reinserimento. Per esempio, sample(my_vector, size=5, replace=TRUE)
Domande di R Programming a livello avanzato
28. Come si crea una nuova colonna in un data frame in R basandosi su altre colonne?
1. Usando le funzioni transform() e ifelse() del base R:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Aggiunta della colonna col_3 al data frame df
df <- transform(df, col_3 = ifelse(col_1 < col_2, col_1 + col_2, col_1 * col_2))
print(df)
Output:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
2. Usando le funzioni with() e ifelse() del base R:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Aggiunta della colonna col_3 al data frame df
df["col_3"] <- with(df, ifelse(col_1 < col_2, col_1 + col_2, col_1 * col_2))
print(df)
Output:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
3. Usando la funzione apply() del base R:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Aggiunta della colonna col_3 al data frame df
df["col_3"] <- apply(df, 1, FUN = function(x) if(x[1] < x[2]) x[1] + x[2] else x[1] * x[2])
print(df)
Output:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
4. Usando la funzione mutate() del pacchetto dplyr e la funzione ifelse() del base R:
df <- data.frame(col_1 = c(1, 3, 5, 7), col_2 = c(8, 6, 4, 2))
print(df)
# Aggiunta della colonna col_3 al data frame df
df <- mutate(df, col_3 = ifelse(col_1 < col_2, col_1 + col_2, col_1 * col_2))
print(df)
Output:
col_1 col_2
1 1 8
2 3 6
3 5 4
4 7 2
col_1 col_2 col_3
1 1 8 9
2 3 6 9
3 5 4 20
4 7 2 14
29. Come si effettua il parsing di una data dalla sua rappresentazione in stringa in R?
Per effettuare il parsing di una data dalla sua rappresentazione testuale in R, dovremmo usare il pacchetto lubridate della collezione tidyverse. Questo pacchetto offre varie funzioni per analizzare una stringa ed estrarne la data standard in base al pattern iniziale della data nella stringa. Queste funzioni sono ymd(), ymd_hm(), ymd_hms(), dmy(), dmy_hm(), dmy_hms(), mdy(), mdy_hm(), mdy_hms(), ecc., dove y, m, d, h, m e s corrispondono rispettivamente a anno, mese, giorno, ore, minuti e secondi.
Per esempio, se eseguiamo la funzione dmy() passandole una delle stringhe "05-11-2023", "05/11/2023" o "05.11.2023", che rappresentano la stessa data, otterremo lo stesso risultato: 2023-11-05. Questo perché in tutti e tre i casi, nonostante i diversi simboli divisori, abbiamo in realtà lo stesso pattern: giorno seguito da mese seguito da anno.
30. A cosa serve la funzione switch() in R?
La funzione switch() in R è un'istruzione di diramazione multipla che valuta un'espressione rispetto agli elementi di una lista. Ha la seguente sintassi:
switch(expression, case_1, case_2, case_3....)
L'espressione passata a switch() può valutarsi a un numero o a una stringa di caratteri e, a seconda di ciò, il comportamento della funzione è diverso.
1. Se l'espressione si valuta a un numero, la funzione switch() restituisce l'elemento dalla lista in base alla corrispondenza posizionale (cioè il cui indice è uguale al numero a cui si valuta l'espressione). Se il numero è maggiore del numero di elementi nella lista, switch() restituisce NULL. Per esempio:
switch(2, "circle", "triangle", "square")
Output:
"triangle"
2. Se l'espressione si valuta a una stringa di caratteri, switch() restituisce il valore in base al suo nome:
switch("red", "green"="apple", "orange"="carot", "red"="tomato", "yellow"="lemon")
Output:
"tomato"
Se ci sono più corrispondenze, viene restituito il primo valore corrispondente. È anche possibile aggiungere un elemento senza nome come ultimo argomento della funzione switch() che fungerà da opzione di fallback predefinita in caso di nessuna corrispondenza. Se questa opzione predefinita non è impostata e non ci sono corrispondenze, la funzione restituisce NULL.
La funzione switch() è un'alternativa efficiente a lunghe catene di if-else, poiché rende il codice meno ripetitivo e più leggibile. In genere, è usata per valutare una singola espressione. Possiamo comunque scrivere costrutti switch annidati più complessi per valutare più espressioni. Tuttavia, in questa forma, switch() diventa rapidamente difficile da leggere e quindi perde il suo principale vantaggio rispetto ai costrutti if-else.
31. Qual è la differenza tra le funzioni apply(), lapply(), sapply() e tapply()?
Sebbene tutte queste funzioni consentano di iterare su una struttura dati senza usare cicli ed eseguire la stessa operazione su ciascun elemento, differiscono per tipo di input e output e per la funzione che svolgono.
-
apply()—accetta un data frame, una matrice o un array e restituisce un vettore, una lista, una matrice o un array. Può essere applicata per righe, per colonne o su entrambe. -
lapply()—accetta un vettore, una lista o un data frame e restituisce sempre una lista. Nel caso di un data frame come input, è applicata solo per colonne. -
sapply()—accetta un vettore, una lista o un data frame e restituisce la struttura dati più semplificata, cioè un vettore per un vettore in input, una lista per una lista in input e una matrice per un data frame in input. -
tapply()—calcola statistiche di sintesi per diversi factor (cioè dati categoriali).
32. Elenca e definisci le istruzioni di controllo in R.
Ci sono tre gruppi di istruzioni di controllo in R: istruzioni condizionali, istruzioni di ciclo e istruzioni di salto.
Istruzioni condizionali:
-
if—verifica se una data condizione è vera e fornisce le operazioni da eseguire se lo è. -
if-else—verifica se una data condizione è vera, fornisce le operazioni da eseguire se lo è e un altro insieme di operazioni da eseguire nel caso opposto. -
if... else if... else—verifica una serie di condizioni una per una, fornisce le operazioni da eseguire per ciascuna condizione se vera e un insieme di fallback da eseguire se nessuna condizione è vera. -
switch—valuta un'espressione rispetto agli elementi di una lista e restituisce un valore dalla lista in base ai risultati di tale valutazione.
Istruzioni di ciclo:
-
for—nei for loop, itera su una sequenza. -
while—nei while loop, verifica se una condizione logica predefinita (o più condizioni) è soddisfatta all'iterazione corrente. -
repeat—nei repeat loop, continua a eseguire lo stesso insieme di operazioni finché non è soddisfatta una condizione di interruzione predefinita (o più condizioni).
Istruzioni di salto:
-
next—salta una particolare iterazione di un ciclo e passa alla successiva se è soddisfatta una certa condizione. -
break—ferma ed esce dal ciclo in una particolare iterazione se è soddisfatta una certa condizione. -
return—esce da una funzione e restituisce il risultato.
33. Cosa sono le espressioni regolari e come si usano in R?
Un'espressione regolare, o regex, in R o in altri linguaggi, è un carattere o una sequenza di caratteri che descrive un certo pattern testuale ed è usata per l'estrazione di informazioni da testi. In R, ci sono due modi principali di lavorare con le espressioni regolari:
- Usare il base R e le sue funzioni (come
grep(),regexpr(),gsub(),regmatches(), ecc.) per individuare, confrontare, estrarre e sostituire regex. - Usare il pacchetto specializzato stringr della collezione tidyverse. È un modo più comodo di lavorare con le regex in R poiché le funzioni di stringr hanno nomi e sintassi molto più intuitivi e offrono funzionalità più estese.
A Guide to R Regular Expressions fornisce maggiori dettagli su come lavorare con le regex in R.
34. Quali pacchetti si usano per il machine learning in R?
- caret—per vari algoritmi di classificazione e regressione.
- e1071—per support vector machines (SVM), classificatore naive Bayes, bagged clustering, fuzzy clustering e k-nearest neighbors (KNN).
- kernlab—fornisce metodi basati su kernel per algoritmi di classificazione, regressione e clustering.
- randomForest—per algoritmi di classificazione e regressione random forest.
- xgboost—per gradient boosting, regressione lineare e alberi decisionali.
- rpart—per partizionamento ricorsivo in alberi di classificazione, regressione e sopravvivenza.
- glmnet—per metodi di regularizzazione lasso ed elastic-net applicati a regressione lineare, logistica e multinomiale.
- nnet—per reti neurali e algoritmi log-lineari multinomiali.
- tensorflow—l'interfaccia R a TensorFlow, per reti neurali profonde e calcolo numerico con grafi di flusso di dati.
- Keras—l'interfaccia R a Keras, per reti neurali profonde.
35. Come si selezionano le feature per il machine learning in R?
Consideriamo tre approcci diversi e come implementarli nel pacchetto caret.
- Rilevando e rimuovendo le feature altamente correlate dal dataset.
Dobbiamo creare una matrice di correlazione di tutte le feature e poi identificare quelle altamente correlate, di solito con coefficiente di correlazione maggiore di 0,75:
corr_matrix <- cor(features)
highly_correlated <- findCorrelation(corr_matrix, cutoff=0.75)
print(highly_correlated)
- Classificando le feature del data frame per importanza.
Dobbiamo creare uno schema di training per controllare i parametri di train, usarlo per costruire un modello selezionato e poi stimare l'importanza delle variabili per quel modello:
control <- trainControl(method="repeatedcv", number=10, repeats=5)
model <- train(response_variable~., data=df, method="lvq", preProcess="scale", trControl=control)
importance <- varImp(model)
print(importance)
- Selezionando automaticamente le feature ottimali.
Uno dei metodi più popolari forniti da caret per selezionare automaticamente le feature ottimali è un algoritmo di selezione all'indietro chiamato Recursive Feature Elimination (RFE).
Dobbiamo calcolare il controllo usando un metodo di ricampionamento selezionato e una lista predefinita di funzioni, applicare l'algoritmo RFE passando le feature, la variabile target, il numero di feature da mantenere e il controllo, e poi estrarre i predittori selezionati:
control <- rfeControl(functions=caretFuncs, method="cv", number=10)
results <- rfe(features, target_variable, sizes=c(1:8), rfeControl=control)
print(predictors(results))
Se hai bisogno di rafforzare le tue competenze di machine learning in R, ecco una risorsa solida e completa: Machine Learning Scientist with R.
36. Cosa sono correlazione e covarianza e come si calcolano in R?
La correlazione è una misura dell'intensità e della direzione della relazione lineare tra due variabili. Assume valori da -1 (correlazione negativa perfetta) a 1 (correlazione positiva perfetta). La covarianza è una misura del grado in cui due variabili cambiano l'una rispetto all'altra e della direzione della loro relazione lineare. A differenza della correlazione, la covarianza non ha un intervallo limitato.
In R, per calcolare la correlazione usiamo la funzione cor(), per calcolare la covarianza—la funzione cov(). La sintassi di entrambe è identica: dobbiamo passare due variabili (vettori) per cui vogliamo calcolare la misura (ad es. cor(vector_1, vector_2) o cov(vector_1, vector_2)), oppure l'intero data frame, se vogliamo calcolare correlazione o covarianza tra tutte le variabili di quel data frame (ad es. cor(df) or cov(df)). Nel caso di due vettori, il risultato sarà un singolo valore; nel caso di un data frame, il risultato sarà una matrice di correlazione (o covarianza).
37. Elenca e definisci i vari approcci per stimare l'accuratezza di un modello in R.
Di seguito alcuni approcci e come implementarli nel pacchetto caret di R.
- Data splitting—l'intero dataset è suddiviso in un training set e un test set. Il primo è usato per addestrare il modello, il secondo per testarne le prestazioni su dati non visti. Questo approccio funziona particolarmente bene con big data. Per implementare il data splitting in R, dobbiamo usare la funzione
createDataPartition()e impostare il parametro p alla proporzione di dati necessaria per il training. - Bootstrap resampling—estrazione di campioni casuali di dati dal dataset e stima del modello su di essi. Tali iterazioni di ricampionamento sono eseguite molte volte e con reinserimento. Per implementare il bootstrap in R, dobbiamo impostare il parametro
methoddella funzionetrainControl()su"boot"quando definiamo il controllo di training del modello. - Metodi di cross-validation
- k-fold cross-validation —il dataset è suddiviso in k sottoinsiemi. Il modello è addestrato su k-1 sottoinsiemi e testato su quello rimanente. Lo stesso processo si ripete per tutti i sottoinsiemi e poi si stima l'accuratezza finale del modello.
- Repeated k-fold cross-validation —il principio è lo stesso della k-fold cross-validation, solo che il dataset è suddiviso in k sottoinsiemi più di una volta. Per ogni ripetizione, si stima l'accuratezza del modello e poi l'accuratezza finale è calcolata come media delle accuratezze su tutte le ripetizioni.
- Leave-one-out cross-validation (LOOCV) —una singola osservazione è messa da parte e il modello è addestrato su tutte le altre osservazioni. Lo stesso processo si ripete per tutte le osservazioni.
Per implementare questi metodi di cross-validation in R, dobbiamo impostare il parametro method della funzione trainControl() rispettivamente su "cv", "repeatedcv" o "LOOCV" quando definiamo il controllo di training del modello.
38. Che cos'è il test chi-quadrato e come lo esegui in R?
Il test statistico del chi-quadrato è una tecnica usata per determinare se due variabili categoriali sono indipendenti o se esiste una correlazione tra di esse. Per eseguire il test del chi-quadrato in R, dobbiamo usare la funzione chisq.test() del pacchetto stats. I passaggi sono i seguenti:
1. Crea una tabella di contingenza con le variabili categoriali di interesse usando la funzione table() del base R:
table = table(df["var_1"], df["var_2"])
2. Passa la tabella di contingenza alla funzione chisq.test():
chisq.test(table)
Puoi rinfrescare le tue conoscenze sui test chi-quadrato e altri test di ipotesi nel nostro corso Hypothesis Testing in R.
39. Che cos'è Shiny in R?
Shiny è un pacchetto R open source che consente di creare in modo semplice e rapido applicazioni web e pagine web completamente interattive per la data science usando solo R, senza alcuna conoscenza di HTML, CSS o JavaScript. Shiny in R offre numerose funzionalità di base e avanzate, widget, layout, esempi di web app e il relativo codice su cui basarsi e da personalizzare, oltre a showcase di utenti da vari settori (tecnologia, sport, banking, istruzione, ecc.) raccolti e categorizzati dalla community degli sviluppatori di Shiny.
40. Qual è la differenza tra le funzioni with() e within()?
La funzione with() valuta un'espressione R su una o più variabili di un data frame e produce l'output senza modificare il data frame. La funzione within() valuta un'espressione R su una o più variabili di un data frame, modifica il data frame e produce l'output. Di seguito vediamo come funzionano queste funzioni usando un data frame di esempio:
df <- data.frame(a = c(1, 2, 3), b = c(10, 20, 30))
print(df)
with(df, a * b)
print(within(df, c <- a * b))
Output:
a b
1 1 10
2 2 20
3 3 30
10 40 90
a b c
1 1 10 10
2 2 20 40
3 3 30 90
Quando usi la funzione within(), per salvare le modifiche devi assegnare l'output della funzione a una variabile.
Conclusione
In conclusione, in questo articolo abbiamo considerato le 40 domande più comuni per colloqui su R programming e quali risposte ci si aspetta per ciascuna. Speriamo che, con queste informazioni a disposizione, tu ti senta più sicuro e pronto per un colloquio su R di successo, sia che tu stia cercando un lavoro in R sia che tu stia cercando la persona giusta per una posizione aperta nella tua azienda.
Per fare pratica nel rispondere alle domande, dai un'occhiata al nostro corso Practicing Statistics Interview Questions in R.
Data Scientist certificato IBM (2020), in precedenza geologo/geonumerico petrolifero con esperienza in campi oil & gas a livello mondiale e oltre 12 anni di lavoro internazionale. Competente in Python, R e SQL. Aree di competenza: data cleaning, manipolazione dei dati, visualizzazione dei dati, analisi dei dati, modellazione dei dati, statistica, storytelling, machine learning. Ampia esperienza nella gestione di community di data science e nella scrittura/revisione di articoli e tutorial su data science e temi di carriera.


