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 550003. 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 NA4. 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> 650005. 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> 650006. 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")))Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Sfida
FacileCrea 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:
- Eseguire una join interna per combinare i libri con le loro valutazioni
- Eseguire una join sinistra per includere tutti i libri, anche quelli senza valutazioni
- Eseguire una join destra per includere tutte le valutazioni, anche quelle dei libri che non sono nell’elenco dei libri
- Eseguire una join completa per includere tutti i libri e tutte le valutazioni
- Per ogni risultato della join, calcolare e aggiungere una colonna per il numero di valutazioni
- 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