Łączenie danych za pomocą dplyr
Lekcja 8 z 14 w kursie Manipulowanie danymi w R w Coddy.
Łączenie danych to kluczowa operacja w manipulowaniu danymi, która pozwala łączyć wiele ramek danych na podstawie wspólnych kolumn. Pakiet dplyr w R udostępnia wydajne funkcje do różnych typów złączeń. Przyjrzyjmy się głównym operacjom łączenia: złączeniu wewnętrznemu, lewemu, prawemu i pełnemu.
1. Przygotowanie danych
Najpierw utwórzmy dwie przykładowe ramki danych, aby zademonstrować operacje łączenia:
# Załaduj dplyr
library(dplyr)
# Utwórz przykładowe ramki danych
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. Złączenie wewnętrzne
Złączenie wewnętrzne zwraca tylko te wiersze, które mają pasujące wartości w obu ramkach danych:
inner_join_result <- inner_join(employees, salaries, by = "emp_id")
print(inner_join_result)Wynik:
emp_id name department salary
1 1 Alice HR 50000
2 2 Bob IT 60000
3 3 Charlie Finance 550003. Złączenie lewe
Złączenie lewe zwraca wszystkie wiersze z lewej ramki danych oraz pasujące wiersze z prawej ramki danych:
left_join_result <- left_join(employees, salaries, by = "emp_id")
print(left_join_result)Wynik:
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. Złączenie prawe
Złączenie prawe zwraca wszystkie wiersze z prawej ramki danych oraz pasujące wiersze z lewej ramki danych:
right_join_result <- right_join(employees, salaries, by = "emp_id")
print(right_join_result)Wynik:
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. Złączenie pełne
Złączenie pełne zwraca wszystkie wiersze, jeśli w lewej lub prawej ramce danych występuje dopasowanie:
full_join_result <- full_join(employees, salaries, by = "emp_id")
print(full_join_result)Wynik:
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. Określanie kolumn złączenia
Jeśli nazwy kolumn różnią się w obu ramkach danych, możesz jawnie określić kolumny złączenia:
# Zakładając, że 'salaries' ma 'employee_id' zamiast '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. Dodawanie nowych kolumn
Dodawanie lub modyfikowanie kolumn za pomocą mutate() Funkcja mutate() w pakiecie dplyr pozwala dodawać nowe kolumny lub modyfikować istniejące w ramce danych. Często używa się jej po operacjach łączenia, aby wykonywać obliczenia lub przekształcenia na połączonych danych:
Podstawowe użycie:
result <- data_frame %>% mutate(new_column = calculation)Przykład:
# Dodaj kolumnę z premią do połączonych danych
result_with_bonus <- inner_join(employees, salaries, by = "emp_id") %>%
mutate(bonus = salary * 0.1)Możesz również użyć mutate(), aby wykonywać bardziej złożone obliczenia lub stosować logikę warunkową:
# Dodaj kategorię oceny pracy na podstawie wynagrodzenia
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")))Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wyzwanie
ŁatwyUtwórz funkcję, która wykonuje serię operacji łączenia na dwóch ramkach danych zawierających informacje o książkach i ich ocenach. Funkcja powinna:
- Wykonać łączenie wewnętrzne, aby połączyć książki z ich ocenami
- Wykonać łączenie lewostronne, aby uwzględnić wszystkie książki, nawet te bez ocen
- Wykonać łączenie prawostronne, aby uwzględnić wszystkie oceny, również te dotyczące książek spoza listy książek
- Wykonać pełne łączenie, aby uwzględnić wszystkie książki i wszystkie oceny
- Dla każdego wyniku łączenia obliczyć i dodać kolumnę z liczbą ocen
- Zwrócić listę zawierającą wszystkie cztery wyniki łączenia
Spróbuj swoich sił
# Wczytaj wszystkie wiersze danych wejściowych
con <- file("stdin", "r")
all_lines <- suppressWarnings(readLines(con))
# Znajdź indeks, od którego zaczyna się druga ramka danych
separator_index <- which(grepl("^book_id,rating,user_id", all_lines))
# Podziel dane wejściowe na dwie części
books_data <- all_lines[1:(separator_index - 1)]
ratings_data <- all_lines[separator_index:length(all_lines)]
# Załaduj wymaganą bibliotekę
suppressPackageStartupMessages(library(dplyr))
# Przekształć wejściowe ciągi znaków w ramki danych
books <- read.csv(text = paste(books_data, collapse = "\n"), stringsAsFactors = FALSE)
ratings <- read.csv(text = paste(ratings_data, collapse = "\n"), stringsAsFactors = FALSE)
# TODO: Napisz swój kod poniżej
# Wykonaj wymagane operacje łączenia i obliczenia
# Funkcja wykonująca operacje łączenia
perform_joins <- function(books, ratings) {
# Twój kod tutaj
# Zwróć listę zawierającą wyniki wszystkich czterech operacji łączenia
list(
inner_join = NULL,
left_join = NULL,
right_join = NULL,
full_join = NULL
)
}
# Wywołaj funkcję i zapisz wyniki
results <- perform_joins(books, ratings)
# Wyświetl wyniki
print(results)Wszystkie lekcje w sekcji Manipulowanie danymi w R
1Podstawy danych
Poznawanie struktur danychIndeksowanie w DataFrameWybieranie podzbioru danychKonwersja typów danychOperator potoku w R4Zaawansowana manipulacja danymi
Manipulowanie ciągami znakówObsługa daty i czasuFunkcje niestandardowe2Przekształcanie danych
Wprowadzenie do dplyrAgregowanie danych za pomocą dplyrŁączenie danych za pomocą dplyrPoćwicz samodzielnie: Kompilator R online