Come Scrivere Istruzioni Condizionali in R Quattro Metodi

Four methods to write conditional statements in R.

Scopri modi potenti per andare oltre le dichiarazioni if-else e migliorare il tuo codice R

Foto di Caleb Jones su Unsplash

Non si può fare molta programmazione senza utilizzare le dichiarazioni condizionali.

Le dichiarazioni condizionali eseguono il codice in base al risultato di una condizione vera o falsa. Sono una parte essenziale della programmazione e questo è particolarmente vero in R. Che tu stia usando R per l’analisi dei dati, il machine learning, lo sviluppo software o altro, le dichiarazioni condizionali hanno infinite applicazioni.

Tuttavia, la maggior parte dei principianti in R non si rende conto che ci sono molti modi per scriverle. Molte persone imparano le dichiarazioni if-else di base e si fermano lì. Ma spesso ci sono modi più eleganti ed efficienti per scrivere dichiarazioni condizionali. I programmatori R avanzati conoscono ognuna di queste tecniche e quando utilizzarle. Quindi, come puoi imparare a fare lo stesso?

In questo articolo, vedremo quattro modi diversi per scrivere dichiarazioni condizionali in R. Discuteremo anche i punti di forza e le limitazioni di ciascuna tecnica e quando utilizzarla.

Come scrivere una dichiarazione if-else in R

Il modo più semplice di scrivere dichiarazioni condizionali in R è utilizzando le parole chiave if e else. Questo sarà familiare se conosci già un altro linguaggio di programmazione ed è spesso la tecnica che i nuovi utenti di R imparano per primi.

Una dichiarazione if standard in R si presenta così:

if (condizione) {  # Codice da eseguire}

Qui, condizione è un’espressione logica che restituisce TRUE o FALSE. Se la condizione restituisce TRUE, qualsiasi codice all’interno delle parentesi graffe viene eseguito. Se restituisce FALSE, il codice all’interno delle parentesi graffe non viene eseguito e R passa alla riga successiva del codice nello script.

Per vedere come funziona nella pratica, possiamo prendere il seguente esempio.

età <- 25if (età >= 18) {  gruppo_età <- "adulto"}

Qui, abbiamo una variabile che contiene un’età. La dichiarazione if valuta quindi se il valore di età è maggiore o uguale a 18. Questo è vero in questo caso, quindi la variabile gruppo_età assume il valore di "adulto".

Questa è un facile modo per controllare una semplice condizione e fare qualcosa se è vera. Ma cosa succede se vogliamo che la dichiarazione esegua del codice se la condizione è falsa?

Le dichiarazioni if-else sono un’estensione della dichiarazione if di base. Per comprenderle, possiamo aggiungere al nostro esempio precedente.

if (età >= 18) {  gruppo_età <- "adulto"} else {  gruppo_età <- "bambino"}

Questo codice funziona proprio come nell’ultimo esempio, con un’eccezione. Invece di passare alla riga successiva quando la condizione è FALSE, il codice all’interno delle parentesi graffe dopo else viene eseguito. Ciò significa che se età è maggiore o uguale a 18, gruppo_età viene assegnato un valore di "adulto". Se no, gruppo_età viene impostato su "bambino".

Le dichiarazioni if-else sono un modo semplice per controllare il codice in uno script R. Sono facilmente comprensibili, possono essere estese per prendere molte condizioni e possono eseguire codice complesso che è lungo molte righe.

Ma le dichiarazioni if-else possono occupare molto spazio. Per espressioni semplici come quella sopra, ci sono altri modi per fare esattamente la stessa operazione senza utilizzare cinque righe di codice.

In effetti, è possibile scrivere dichiarazioni if-else utilizzando una sola riga di codice.

Dichiarazioni condizionali inline in R

Le dichiarazioni condizionali inline sono un modo elegante di esprimere la logica “if-else” in una singola riga di codice. Ci sono un paio di modi per scriverle.

Istruzione if-else in linea

Prima di tutto, è possibile scrivere una semplice istruzione in linea utilizzando le parole chiave if e else. Prende la forma seguente:

age_group <- if (age >= 18) "adult" else "child"

Questa istruzione funziona allo stesso modo dell’esempio precedente. L’unica differenza è che ora abbiamo condensato la formulazione per farla entrare in una sola riga. Se la condizione è TRUE, il valore di age_group viene aggiornato con ciò che è prima della parola chiave else – in questo caso, "adult". Se fosse FALSE, age_group sarebbe assegnato a qualsiasi cosa viene dopo else.

La grande differenza qui è che ora assegniamo il risultato dell’intera istruzione condizionale alla variabile age_group. Questo migliora la ripetitiva formulazione nell’esempio standard if-else, dove dovevamo scrivere questa assegnazione due volte.

Funzione ifelse di Base-R

Se preferisci, puoi utilizzare invece la funzione ifelse. Il codice seguente utilizza questa funzione per eseguire la stessa logica degli esempi precedenti.

age_group <- ifelse(age >= 18, "adult", "child")

La funzione ifelse prende tre argomenti. Prima viene la condizione, poi un valore da restituire se la condizione è vera e un valore da restituire se la condizione è falsa.

Si tratta di un modo pulito e semplice di scrivere un’istruzione condizionale breve. Ha anche un altro vantaggio: è vettorizzata.

Rendi il tuo codice R 10 volte più veloce: la vettorizzazione spiegata in 3 minuti

Dì addio a loop lenti e caotici

towardsdatascience.com

La vettorizzazione è un concetto importante in R. Se una funzione è vettorizzata, si applica automaticamente a più valori invece che a uno solo. Per vedere un esempio con la funzione ifelse, assegniamo più valori alla nostra variabile age e eseguiamo di nuovo il codice.

age <- c(16, 45, 23, 82)age_group <- ifelse(age >= 18, "adult", "child")# Restituisce "child" "adult" "adult" "adult"

La funzione ifelse valuta automaticamente tutti i valori in age, restituendo una sequenza di output corrispondenti. Questo rende ifelse un modo pulito di valutare molte condizioni semplici senza bisogno di loop lenti e caotici.

Indicizzazione condizionale in R

Anche se ifelse può valutare facilmente molte voci, ci sono altri modi per farlo.

L’indicizzazione consente ai programmatori R di accedere a parti specifiche di una struttura dati che contiene molti valori. Ad esempio, se volessimo ottenere il terzo elemento nel vettore age dell’ultimo esempio, potremmo indicizzare age con 3 all’interno di parentesi quadre:

age <- c(16, 45, 23, 82)age# Restituisce 16, 45, 23, 82age[3]# Restituisce 23

È più comune utilizzare numeri per indicizzare i valori con determinate posizioni, come nel codice sopra. Ma molti programmatori R principianti non sanno che è possibile utilizzare anche condizioni logiche durante l’indicizzazione. Questo apre tutte le possibilità.

Creiamo alcuni dati di esempio per illustrare alcune di queste opzioni. Questi includono alcune informazioni sugli utenti, come l’età, come negli esempi precedenti. Ma anziché essere memorizzate in un vettore, le informazioni di ciascun utente sono memorizzate per riga in una tabella. Questo è il tipo di struttura dati che potresti vedere se ti occupi di dati degli utenti in un ambiente professionale, quindi è utile sapere come applicare la logica condizionale ad essa.

set.seed(123)user_data <- tibble(  user_id = 1:10,  age = floor(runif(10, min = 13, max = 35)),  region = sample(c("UK", "USA", "EU"), 10, replace = TRUE))
I dati creati dal codice sopra.

I tibble e i data frame sono composti da vettori, il che significa che possiamo indicizzarli allo stesso modo. Ciò ci consente di fare tutte le cose.

Estrazione dei valori di una colonna basata su una condizione

Ecco del codice che estrae qualsiasi valore della colonna user_id in cui l’età dell’utente è inferiore ai 18 anni.

user_data$user_id[user_data$age < 18]# Restituisce 6

Sostituzione dei valori di una colonna basata su una condizione

Ecco come ricodificare tutte le righe “UK” nella colonna region come “EU”.

user_data$region[user_data$region == "UK"] <- "EU"

Filtraggio di un dataset con indicizzazione condizionale

Potremmo persino usare un sottoinsieme condizionale per filtrare l’intero dataset. Ecco un metodo per filtrare tutte le righe in cui la regione è “USA”. Nota che dopo la condizione logica, qui includiamo una virgola per dire a R che stiamo indicizzando per riga. Se volessimo filtrare per colonna, potremmo aggiungere una condizione dopo la virgola.

user_data[user_data$region == "USA",]
Il risultato del codice sopra.

Questi sono solo alcuni dei casi di utilizzo dell’indicizzazione condizionale in R. Se devi fare una rapida operazione condizionale sui dati, è probabile che ci sia una soluzione in una sola riga che utilizza questo metodo.

Funzione case_when di Tidyverse

La funzione case_when fa parte della famiglia di pacchetti tidyverse. È un altro modo di applicare istruzioni condizionali su un insieme di molti valori ed è ancora una volta utile quando si lavora con dataset.

Possiamo usare i dati dell’ultimo esempio per mostrare come creare una nuova colonna basata su istruzioni condizionali con case_when.

user_data %>%  mutate(drinking_age = case_when(region == "USA" & age >= 21 ~ TRUE,                                  region == "EU" & age >= 18 ~ TRUE,                                  .default = FALSE))

Questo codice determina se gli utenti del nostro sito sono legalmente autorizzati a bere alcolici in base alla loro età e alla loro posizione. Qui, ogni condizione è su una riga diversa nella dichiarazione case_when. Se la condizione è vera, possiamo restituire un valore dopo il simbolo tilde (~) – in questo caso, TRUE. Se nessuna delle condizioni è soddisfatta, il valore restituito è specificato dall’impostazione .default. Tutti i valori sono memorizzati in una nuova colonna, drinking_age.

Se questo sembra un po’ nuovo, ecco l’equivalente dell’istruzione if else:

if (region == "USA" & age >= 21) {  drinking_age <- TRUE} else if (region == "EU" & age >= 18) {  drinking_age <- TRUE} else {  drinking_age <- FALSE}

Rispetto al codice sopra, è facile vedere che case_when fornisce un altro modo di implementare dichiarazioni condizionali che è più conciso dell’istruzione if-else, pur essendo altrettanto potente. È il mio strumento preferito per creare nuove colonne basate su logiche complesse o condizioni multiple. Per gli utenti di tidyverse, è una funzionalità da adottare assolutamente.

Quando utilizzare diversi tipi di dichiarazioni condizionali

I metodi che ho coperto iniziano a brillare veramente solo quando li si mette a lavoro nel proprio codice. Solo sperimentando nuovi approcci e diventando confortevoli con essi, si otterranno tutti i loro vantaggi e si raggiungerà una fluente programmazione in R.

Quando dovresti quindi utilizzare ciascun tipo di dichiarazione condizionale?

Come per qualsiasi scelta tra approcci di programmazione, non esiste una risposta diretta. Detto ciò, ecco alcune linee guida approssimative che uso per aiutarmi a scegliere tra i diversi modi di scrivere dichiarazioni condizionali.

  • Se sto lavorando su un problema che richiede l’esecuzione di molto codice complesso e multilinea in determinate condizioni, preferisco spesso le istruzioni if-else. In queste situazioni, l’utilizzo di altri metodi spesso diventa confusionario e difficile da mantenere.
  • Per i problemi con condizioni più semplici e frammenti di codice più brevi per il ritorno, mi piacciono le istruzioni if-else inline. Non ha senso rendere più lunga di quanto necessario una soluzione diretta!
  • Se si lavora con dataset o si creano colonne basate su condizioni, uso case_when. Funziona bene con le altre funzioni tidyverse che uso ed è facile da debuggare e mantenere.
  • Se sto lavorando con dataset e non voglio caricare pacchetti extra, userò l’indicizzazione condizionale. Non ha bisogno di alcuna dipendenza extra e spesso funziona velocemente anche.

Il mio consiglio? Gioca con ogni tecnica e vedi quale fa al caso tuo. Almeno, potresti imparare un nuovo modo per migliorare il tuo codice.

Quindi, se hai apprezzato questo articolo, perché non condividere la tua dichiarazione condizionale preferita? Altrimenti… grazie per essere rimasto fino alla fine comunque!