Menu
CoddyTech

使用 dplyr 连接数据

Coddy R 中的数据处理 课程的第 8 课,共 14 课。

数据连接是数据处理中的一项重要操作,可以根据共同列合并多个数据框。R 中的 dplyr 包提供了高效的函数,可用于执行各种类型的连接。下面来了解主要的连接操作:内连接、左连接、右连接和全连接。

1. 准备数据

首先,创建两个示例数据框来演示连接操作:

# 加载 dplyr
library(dplyr)

# 创建示例数据框
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. 内连接

内连接只返回在两个数据框中都有匹配值的行:

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

输出:

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

3. 左连接

左连接返回左侧数据框中的所有行,以及右侧数据框中匹配的行:

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

输出:

  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. 右连接

右连接返回右侧数据框中的所有行,以及左侧数据框中匹配的行:

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

输出:

  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. 全连接

如果左侧或右侧数据框中存在匹配项,全连接就会返回所有行:

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

输出:

  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. 指定连接列

如果两个数据框中的列名不同,你可以明确指定要用于连接的列:

# 假设 'salaries' 中的列名是 'employee_id',而不是 '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. 添加新列

使用 mutate() 添加或修改列。mutate() 函数可以让你在数据框中添加新列或修改已有列。它通常在连接操作后使用,对连接后的数据进行计算或转换:

基本用法:

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

示例:

# 在连接后的数据中添加奖金列
result_with_bonus <- inner_join(employees, salaries, by = "emp_id") %>%
  mutate(bonus = salary * 0.1)

你也可以使用 mutate() 执行更复杂的计算,或使用条件逻辑:

# 根据薪资添加绩效类别
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 icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

challenge icon

挑战

简单

创建一个函数,对两个包含图书及其评分信息的数据框执行一系列连接操作。该函数应:

  1. 执行内连接,将图书与其评分合并
  2. 执行左连接,包含所有图书,即使有些图书没有评分
  3. 执行右连接,包含所有评分,即使评分对应的图书不在图书列表中
  4. 执行全连接,包含所有图书和所有评分
  5. 为每个连接结果计算并添加一个表示评分数量的列
  6. 返回一个包含全部四种连接结果的列表

亲手试试

# 读取所有输入行
con <- file("stdin", "r")
all_lines <- suppressWarnings(readLines(con))

# 找到第二个数据框开始的位置索引
separator_index <- which(grepl("^book_id,rating,user_id", all_lines))

# 将输入拆分成两部分
books_data <- all_lines[1:(separator_index - 1)]
ratings_data <- all_lines[separator_index:length(all_lines)]

# 加载所需的库
suppressPackageStartupMessages(library(dplyr))

# 将输入字符串转换为数据框
books <- read.csv(text = paste(books_data, collapse = "\n"), stringsAsFactors = FALSE)
ratings <- read.csv(text = paste(ratings_data, collapse = "\n"), stringsAsFactors = FALSE)


# TODO: 在下方编写你的代码
# 执行所需的连接操作和计算

# 执行连接操作的函数
perform_joins <- function(books, ratings) {
  # 在这里编写你的代码
  
  # 返回包含全部四种连接结果的列表
  list(
    inner_join = NULL,
    left_join = NULL,
    right_join = NULL,
    full_join = NULL
  )
}

# 调用函数并存储结果
results <- perform_joins(books, ratings)

# 打印结果
print(results)

R 中的数据处理中的所有课

自己练习: R 在线编译器