使用 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 550003. 左连接
左连接返回左侧数据框中的所有行,以及右侧数据框中匹配的行:
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 NA4. 右连接
右连接返回右侧数据框中的所有行,以及左侧数据框中匹配的行:
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> 650005. 全连接
如果左侧或右侧数据框中存在匹配项,全连接就会返回所有行:
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> 650006. 指定连接列
如果两个数据框中的列名不同,你可以明确指定要用于连接的列:
# 假设 '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")))这节课包含一个小测验。开始学习即可作答,并记录你的进度。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
挑战
简单创建一个函数,对两个包含图书及其评分信息的数据框执行一系列连接操作。该函数应:
- 执行内连接,将图书与其评分合并
- 执行左连接,包含所有图书,即使有些图书没有评分
- 执行右连接,包含所有评分,即使评分对应的图书不在图书列表中
- 执行全连接,包含所有图书和所有评分
- 为每个连接结果计算并添加一个表示评分数量的列
- 返回一个包含全部四种连接结果的列表
亲手试试
# 读取所有输入行
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 在线编译器