Menu
Coddy logo textTech

Łą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  55000

3. 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     NA

4. 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>  65000

5. 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>  65000

6. 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")))
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

challenge icon

Wyzwanie

Łatwy

Utwórz funkcję, która wykonuje serię operacji łączenia na dwóch ramkach danych zawierających informacje o książkach i ich ocenach. Funkcja powinna:

  1. Wykonać łączenie wewnętrzne, aby połączyć książki z ich ocenami
  2. Wykonać łączenie lewostronne, aby uwzględnić wszystkie książki, nawet te bez ocen
  3. Wykonać łączenie prawostronne, aby uwzględnić wszystkie oceny, również te dotyczące książek spoza listy książek
  4. Wykonać pełne łączenie, aby uwzględnić wszystkie książki i wszystkie oceny
  5. Dla każdego wyniku łączenia obliczyć i dodać kolumnę z liczbą ocen
  6. 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

Poćwicz samodzielnie: Kompilator R online