Menu
Coddy logo textTech

Unione dei dati con dplyr

Lezione 8 di 14 del corso Manipolazione dei dati in R di Coddy.

L'unione dei dati è un'operazione fondamentale nella manipolazione dei dati e consente di combinare più frame di dati in base a colonne comuni. Il pacchetto dplyr in R fornisce funzioni efficienti per vari tipi di unioni. Esploriamo le principali operazioni di unione: unione interna, unione sinistra, unione destra e unione completa.

1. Preparazione dei dati

Per prima cosa, creiamo due frame di dati di esempio per illustrare le operazioni di unione:

# Carica dplyr
library(dplyr)

# Crea data frame di esempio
employees <- data.frame(
  emp_id = c(1, 2, 3, 4),
  name = c("Alice", "Bob", "Charlie", "David"),
  department = c("HR", "IT", "Finance", "IT")
)

salaries <- data.frame(
  emp_id = c(1, 2, 3, 5),
  salary = c(50000, 60000, 55000, 65000)
)

2. Unione interna

Un'unione interna restituisce solo le righe che hanno valori corrispondenti in entrambi i frame di dati:

inner_join_result <- inner_join(employees, salaries, by = "emp_id")
print(inner_join_result)

Risultato:

  emp_id   name department salary
1      1  Alice         HR  50000
2      2    Bob         IT  60000
3      3 Charlie    Finance  55000

3. Unione sinistra

Un'unione sinistra restituisce tutte le righe dal frame di dati a sinistra e le righe corrispondenti dal frame di dati a destra:

left_join_result <- left_join(employees, salaries, by = "emp_id")
print(left_join_result)

Risultato:

  emp_id   name department salary
1      1  Alice         HR  50000
2      2    Bob         IT  60000
3      3 Charlie    Finance  55000
4      4  David         IT     NA

4. Unione destra

Un'unione destra restituisce tutte le righe dal frame di dati a destra e le righe corrispondenti dal frame di dati a sinistra:

right_join_result <- right_join(employees, salaries, by = "emp_id")
print(right_join_result)

Risultato:

  emp_id   name department salary
1      1  Alice         HR  50000
2      2    Bob         IT  60000
3      3 Charlie    Finance  55000
4      5   <NA>       <NA>  65000

5. Unione completa

Un'unione completa restituisce tutte le righe quando c'è una corrispondenza nel frame di dati a sinistra o in quello a destra:

full_join_result <- full_join(employees, salaries, by = "emp_id")
print(full_join_result)

Risultato:

  emp_id   name department salary
1      1  Alice         HR  50000
2      2    Bob         IT  60000
3      3 Charlie    Finance  55000
4      4  David         IT     NA
5      5   <NA>       <NA>  65000

6. Specificare le colonne di unione

Se i nomi delle colonne sono diversi nei due frame di dati, puoi specificare esplicitamente le colonne da usare per l'unione:

# Supponendo che 'salaries' abbia 'employee_id' anziché 'emp_id'
salaries_alt <- salaries %>% rename(employee_id = emp_id)

join_result <- inner_join(employees, salaries_alt, by = c("emp_id" = "employee_id"))
print(join_result)

7. Aggiungere nuove colonne

Aggiungere o modificare colonne con mutate() La funzione mutate() in dplyr ti permette di aggiungere nuove colonne o modificare quelle esistenti in un frame di dati. Viene spesso usata dopo le operazioni di unione per eseguire calcoli o trasformazioni sui dati uniti:

Uso di base:

result <- data_frame %>% mutate(new_column = calculation)

Esempio:

# Aggiungi una colonna per il bonus ai dati uniti
result_with_bonus <- inner_join(employees, salaries, by = "emp_id") %>%
  mutate(bonus = salary * 0.1)

Puoi anche usare mutate() per eseguire calcoli più complessi o usare una logica condizionale:

# Aggiungi una categoria di rendimento in base allo stipendio
result_with_category <- inner_join(employees, salaries, by = "emp_id") %>%
	mutate(performance_category = ifelse(salary < 55000, "Needs Improvement",
                                  ifelse(salary < 60000, "Meets Expectations",
                                  "Exceeds Expectations")))
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

challenge icon

Sfida

Facile

Crea una funzione che esegua una serie di operazioni di join su due frame di dati contenenti informazioni sui libri e sulle loro valutazioni. La funzione dovrebbe:

  1. Eseguire una join interna per combinare i libri con le loro valutazioni
  2. Eseguire una join sinistra per includere tutti i libri, anche quelli senza valutazioni
  3. Eseguire una join destra per includere tutte le valutazioni, anche quelle dei libri che non sono nell’elenco dei libri
  4. Eseguire una join completa per includere tutti i libri e tutte le valutazioni
  5. Per ogni risultato della join, calcolare e aggiungere una colonna per il numero di valutazioni
  6. Restituire un elenco contenente tutti e quattro i risultati delle join

Provalo tu

# Leggi tutte le righe di input
con <- file("stdin", "r")
all_lines <- suppressWarnings(readLines(con))

# Trova l'indice in cui inizia il secondo data frame
separator_index <- which(grepl("^book_id,rating,user_id", all_lines))

# Dividi l'input in due parti
books_data <- all_lines[1:(separator_index - 1)]
ratings_data <- all_lines[separator_index:length(all_lines)]

# Carica la libreria necessaria
suppressPackageStartupMessages(library(dplyr))

# Converti le stringhe di input in data frame
books <- read.csv(text = paste(books_data, collapse = "\n"), stringsAsFactors = FALSE)
ratings <- read.csv(text = paste(ratings_data, collapse = "\n"), stringsAsFactors = FALSE)


# TODO: Scrivi il tuo codice qui sotto
# Esegui le operazioni di join e i calcoli richiesti

# Funzione per eseguire le operazioni di join
perform_joins <- function(books, ratings) {
  # Il tuo codice qui
  
  # Restituisci una lista contenente tutti e quattro i risultati dei join
  list(
    inner_join = NULL,
    left_join = NULL,
    right_join = NULL,
    full_join = NULL
  )
}

# Chiama la funzione e memorizza i risultati
results <- perform_joins(books, ratings)

# Stampa i risultati
print(results)

Tutte le lezioni di Manipolazione dei dati in R

Esercitati da solo: Compilatore R online